私はサイトのベースURLを返す小さなヘルパーメソッドを書きたいです。これが私が思いついたものです。
public static string GetSiteUrl()
{
string url = string.Empty;
HttpRequest request = HttpContext.Current.Request;
if (request.IsSecureConnection)
url = "https://";
else
url = "http://";
url += request["HTTP_Host"] + "/";
return url;
}
あなたが考えることができるこれに何か誤りがありますか?誰もがこれを改善することはできますか?
これを試して:
string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +
Request.ApplicationPath.TrimEnd('/') + "/";
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)
それでおしまい ;)
残念ながら、一般的なGetLeftPart
ソリューションは、PCL版のUri
ではサポートされていません。ただし、GetComponents
は移植性が必要な場合はトリックする必要があります。
uri.GetComponents(
UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
上記の答えでは、サイトがWebサイトのルートにない場合は考慮されません。
これはWebApiコントローラ用です。
string baseUrl = (Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/')
+ HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
私にとっては、これまでのところ@ warlockが最良の答えのように見えますが、私はこれまでずっとこれを使ってきました。
string baseUrl = Request.Url.GetComponents(
UriComponents.SchemeAndServer, UriFormat.UriEscaped)
またはWebAPIコントローラ内。
string baseUrl = Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped)
これは便利なので、あなたが望むエスケープフォーマットを選ぶことができます。このように2つの異なる実装がある理由は明確ではありませんし、私が言える限りでは、このメソッドと@ warlockはまったく同じ結果を返しますが、GetLeftPart()
は非サーバーUriでもmailto
タグのように動作する例えば。
一緒に行く
HttpContext.Current.Request.ServerVariables["HTTP_Host"]
これはもっと愚かな方法です。
VirtualPathUtility.ToAbsolute("~/");
ウォーロックが書いたことに基づいて、私はあなたがあなたのウェブのルートでホストされていないなら仮想パスルートが必要であることがわかりました。 (これはMVC Web APIコントローラーに有効です)
String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority)
+ Configuration.VirtualPathRoot;
私はApplication_Startから次のコードを使用しています
String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);
これは私のために働きます。
Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
そのため、自分のドメイン名にアクセスしたい場合は、次の場合にアプリケーション名を含めることを検討してください。
string baseURL = HttpContext.Request.Url.Host;
以下のコードを使用してください
string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);