ASP.NET で現在のドメインを取得する最良の方法は何ですか?
-
09-06-2019 - |
質問
ASP.NET で現在のドメインを取得する最良の方法は何でしょうか?
例えば:
http://www.ドメイン名.com/subdir/ 譲るべきだ http://www.ドメイン名.com http://www.sub.ドメイン名.com/subdir/ 譲るべきだ http://サブ.ドメイン名.com
ガイドとして、「/Folder/Content/filename.html」のような URL (ASP.NET MVC の Url.RouteUrl() によって生成されたものなど) を URL に直接追加でき、機能するはずです。
解決
MattMitchell の回答と同じですが、いくつかの変更が加えられています。これにより、代わりにデフォルトのポートがチェックされます。
編集:更新された構文と使用方法
Request.Url.Authority
提案どおり
$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
他のヒント
とおり このリンク 良い出発点は次のとおりです。
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
ただし、ドメインが http://www.ドメイン名.com:500 これは失敗します。
これを解決するには、次のような方法が魅力的です。
int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
+ (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");
ただし、ポート 80 と 443 は構成によって異なります。
したがって、使用する必要があります IsDefaultPort
のように 受け入れられた回答 上はカルロス・ムニョスより。
Request.Url.GetLeftPart(UriPartial.Authority)
これは含まれたスキームです。
警告! ご利用される皆様へ 現在のリクエスト.URL.ホスト。現在のリクエストに基づいて作業していること、および現在のリクエストが常に自分のサーバーに存在するわけではなく、他のサーバーに存在する可能性があることを理解してください。
したがって、これを Global.asax の Application_BeginRequest() などで使用すると、99.9% の場合は問題ありませんが、0.1% の場合は、自分のサーバーのホスト名以外の名前が取得される可能性があります。
この良い例は、私が少し前に発見したものです。私のサーバーはヒットする傾向があります http://proxyjudge1.proxyfire.net/fastenv 時々。Application_BeginRequest() はこのリクエストを喜んで処理するため、このリクエストの作成中に Request.Url.Host を呼び出すと、proxyjudge1.proxyfire.net が返されます。「そんなことは当たり前」と思う人もいるかもしれませんが、これは 0.1% の確率でしか発生しないため、非常に気づきにくいバグであるため、注目に値します。P
このバグにより、ドメイン ホストを構成ファイルに文字列として挿入する必要がありました。
なぜ使わないのか
Request.Url.Authority
ドメイン全体とポートを返します。
http か https かを判断する必要があります
単純 そして 短い 方法 (スキーマ、ドメイン、ポートをサポートします):
使用 Request.GetFullDomain()
// Add this class to your project
public static class HttpRequestExtensions{
public static string GetFullDomain(this HttpRequestBase request)
{
var uri= request?.UrlReferrer;
if (uri== null)
return string.Empty;
return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
}
}
// Now Use it like this:
Request.GetFullDomain();
// Example output: https://www.example.com:5031
// Example output: http://www.example.com:5031
// Example output: https://www.example.com
別の方法:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
どうでしょうか:
NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];
UriBuilder の使用:
var relativePath = ""; // or whatever-path-you-want
var uriBuilder = new UriBuilder
{
Host = Request.Url.Host,
Path = relativePath,
Scheme = Request.Url.Scheme
};
if (!Request.Url.IsDefaultPort)
uriBuilder.Port = Request.Url.Port;
var fullPathToUse = uriBuilder.ToString();
どうでしょうか:
String domain = "http://" + Request.Url.Host