web-dev-qa-db-ja.com

1回の呼び出しでのRequest.Url.HostとApplicationPath

HttpContext.Current.Request.Url.HostHttpContext.Current.Request.ApplicationPathを1回の呼び出しで取得する方法はありますか?

「完全なアプリケーションURL」のようなものですか?

編集:説明-私が必要なのはこれが[]内の部分です:

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

単に好奇心から求めます。

編集2:すべての返信に感謝しますが、それらのどれも私が探していたものとまったく同じではありませんでした。参考までに、私はこの方法で問題を解決しました(ただし、よりスムーズな方法があるかどうかを知りたいと思っています)。

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;
}
16
Marcus L
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;
}
31
MartinHN

これは私のローカルホストではポート番号で動作していなかったので、少し変更しました:

  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;
    }
18
Samuel

あなたが本当にすべきことは:

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

これにより、HTTPS(またはその他のスキーマ)を使用している場合に機能します。

6
Dan Diplo

すべての返信に感謝しますが、私が探していた回答はまったくありませんでした。参考までに、私はこの方法で問題を解決しました(ただし、よりスムーズな方法があるかどうかを知りたいと思っています)。

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;
}
3
Marcus L

チェック この投稿

_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, "/")

2
veggerby
HttpContext.Current.Request.Url.AbsoluteUri
1
Raj