現在のドメインを取得するための最善の方法はASP.NETでどのようになるのでしょうか?
例えば:
http://www.domainname.com/subdir/ は http://www.domainname.comhttp://www.sub.domainname .com/subdir / は http://sub.domainname.com を生成します
ガイドとして、「/ Folder/Content/filename.html」(ASP.NET MVCのUrl.RouteUrl()によって生成されたものなど)のようなURLを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.domainname.com:5 の場合、これは失敗します。
次のような何かがこれを解決したいです:
int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
+ (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");
ただし、ポート80および443は構成に依存します。
そのため、CarlosMuñozの Accepted Answer のようにIsDefaultPort
を使用する必要があります。
Request.Url.GetLeftPart(UriPartial.Authority)
これはスキームに含まれています。
警告!Current.Request。Url.Host。 CURRENT REQUESTに基づいて作業していること、および現在のリクエストが常にサーバーに送信されるのではなく、他のサーバーに送信される場合があることを理解してください。
したがって、Global.asaxのApplication_BeginRequest()のようなものでこれを使用すると、99.9%の時間で問題ありませんが、0.1%で自分のサーバーのホスト名以外のものを取得できます。
この良い例は、私が少し前に発見したものです。私のサーバーは時々 http://proxyjudge1.proxyfire.net/fastenv をヒットする傾向があります。 Application_BeginRequest()はこのリクエストを喜んで処理するため、このリクエストを行っているときにRequest.Url.Hostを呼び出すと、proxyjudge1.proxyfire.netが返されます。あなたの中には、「当たり前」と思っている人もいるかもしれませんが、0.1%の確率でしか発生しないため、気づくのは非常に難しいバグだったので、注目に値します。
このバグにより、構成ファイルにドメインホストを文字列として挿入する必要がありました。
なぜ使わない
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
どうですか:
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"];
別の方法:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
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();