web-dev-qa-db-ja.com

現在のドメインを取得するASP.NETの最良の方法は何ですか?

現在のドメインを取得するための最善の方法は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に直接追加して、機能するはずです。

98
Matt Mitchell

MattMitchellの回答と同じですが、多少の修正があります。代わりにデフォルトのポートを確認します。

編集:構文を更新し、Request.Url.Authorityを推奨どおりに使用

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
180
Carlos Muñoz

このリンク に従って、適切な出発点は次のとおりです。

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を使用する必要があります。

37
Matt Mitchell
Request.Url.GetLeftPart(UriPartial.Authority)

これはスキームに含まれています。

28
izlence

警告!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%の確率でしか発生しないため、気づくのは非常に難しいバグだったので、注目に値します。

このバグにより、構成ファイルにドメインホストを文字列として挿入する必要がありました。

19
Thirlan

なぜ使わない

Request.Url.Authority

ドメイン全体とポートを返します。

あなたはまだhttpまたはhttpsを理解する必要があります

13
Korayem

シンプルおよびショート方法(スキーマ、ドメイン、ポートをサポート):

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
2
RAM

どうですか:

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"];
1
Derek Lawless

別の方法:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
1
user280429

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();
0
Darren