質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top