2009-03-27 9 views
15

HttpContext.Current.Request.Url.HostHttpContext.Current.Request.ApplicationPathを一度に呼び出す方法はありますか?Request.Url.HostとApplicationPathを1回の呼び出しで

"full application url"のようなものはありますか?

EDIT: - :私は好奇心から、単純に尋ねる

http://[www.mysite.com/mywebapp]/Pages/Default.aspx 

明確化私は必要なものは、これは[]内の部分です。

EDIT 2:すべての返信をありがとうが、それらのどれも私が探していたものではありませんでした。 FYI、私はこの方法で問題を解決します(ただしスムーズな方法があるかどうかを知るにはまだ興味を持っています):

public string GetWebAppRoot() 
{ 
    if(HttpContext.Current.Request.ApplicationPath == "/") 
     return "http://" + HttpContext.Current.Request.Url.Host; 
    else 
     return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath; 
} 
+0

あなたは理論上Request.Url.Authorityが必要です。ホストにはポートがありません。残念ながら、クライアントが接続に使用したサーバのdns:portが含まれているはずなので、あなたの最善の策はRequest.Headers ["HOST"]にあるものを使うことです。 HTTP/1.0リクエストが心配ならば、もちろんRequest.Url.Hostにフォールバックすることができます。 "HOST"ヘッダーのポートではなく、サーバーソフトウェアがバインドされているポートを返すためにRequest.Url.Authorityを個人的に経験しました。これはクライアントが接続に使用したものです。 (FWIW、それはSSRS 2012のReport Manager Webサイトにありました) – Granger

答えて

29
public static string GetSiteRoot() 
{ 
    string port = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"]; 
    if (port == null || port == "80" || port == "443") 
    port = ""; 
    else 
    port = ":" + port; 

    string protocol = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"]; 
    if (protocol == null || protocol == "0") 
    protocol = "http://"; 
    else 
    protocol = "https://"; 

    string sOut = protocol + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + port + System.Web.HttpContext.Current.Request.ApplicationPath; 

    if (sOut.EndsWith("/")) 
    { 
    sOut = sOut.Substring(0, sOut.Length - 1); 
    } 

    return sOut; 
} 
+0

IIRC SERVER_NAMEは必要なホスト名を取得しない可能性があります。ホストヘッダー解決(http://msdn.microsoft.com/en-us/library/ms524602.aspx)私が間違っていると私を訂正してください:) – veggerby

+2

私はこのサイトを別のサイトで何年も使用しています。リクエストのサーバー名がhttp://から最初の/ – MartinHN

+0

になります作品、おかげで束。非標準ポートとhttps://www.blah.com/web/test/hello.aspxのようなURLで動作するものを探していました。私はそれをスピンします。 – infocyde

2

チェックthis post

public static Uri GetBaseUrl(HttpRequest request) 
{ 
    Uri contextUri = new Uri(request.Url, request.RawUrl); 
    UriBuilder realmUri = new UriBuilder(contextUri) { Path = request.ApplicationPath, Query = null, Fragment = null }; 
    return realmUri.Uri; 
} 

public static string GetAbsoluteUrl(HttpRequest request, string relativeUrl) 
{ 
    return new Uri(GetBaseUrl(request), VirtualPathUtility.ToAbsolute(relativeUrl)).AbsoluteUri; 
} 

すると、あなたがから必要なものを取得しない場合は、 GetBaseUrlは直接使う、行うことが可能なはずである。

GetAbsoluteUrl(HttpContext.Current.Request, "/")

1
HttpContext.Current.Request.Url.AbsoluteUri 
+0

ありがとうございますが、それはあなたから呼び出されたASPXページの完全なパスを提供します。私は、ページパスではなくホスト+アプリケーションパスだけを必要とします。 –

3

すべての返信をありがとうが、それらのどれも私が探していたものではありませんでした。 FYI、私はこの方法で問題を解決します(ただしスムーズな方法があるかどうかを知るにはまだ興味を持っています):

public string GetWebAppRoot() 
{ 
    if(HttpContext.Current.Request.ApplicationPath == "/") 
     return "http://" + HttpContext.Current.Request.Url.Host; 
    else 
     return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath; 
} 
+0

httpsの場合はどうなりますか? –

+0

はい、私の解決策はそれを実際には処理しませんが、これは次のようになります。 return String.Format( "{0}:// {1} /"、Request.Url.Scheme、Request.Url.Host); –

5

あなたが本当にやるべきことは次のとおりです。

return String.Format("{0}://{1}/", Request.Url.Scheme, Request.Url.Host); 

その方法、それはあなたの場合は動作しますHTTPSを使用している

これは、ポート番号と私のローカルホスト上で動作していませんでし
16

はとてもマイナーな修正製の(またはいくつかの他のスキーマを!):

private string GetWebAppRoot() 
    { 
     string host = (HttpContext.Current.Request.Url.IsDefaultPort) ? 
      HttpContext.Current.Request.Url.Host : 
      HttpContext.Current.Request.Url.Authority; 
     host = String.Format("{0}://{1}", HttpContext.Current.Request.Url.Scheme, host);    
     if (HttpContext.Current.Request.ApplicationPath == "/") 
      return host; 
     else 
      return host + HttpContext.Current.Request.ApplicationPath; 
    } 
を210