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


102

現在のドメインを取得するための最良の方法はASP.NETであると思いますか?

例えば:

http://www.domainname.com/subdir/http://www.domainname.com http://www.sub.domainname.com/subdir/を生成する必要があります http://sub.domainname.com

ガイドとして、 "/ Folder / Content / filename.html"(ASP.NET MVCのUrl.RouteUrl()によって生成されたものなど)などのURLを直接URLに追加できれば機能します。


3
ここでの「現在のドメイン」は実際には、消費するユーザーエージェントがサイトにアクセスするために使用したものであり、多くの場合、サイトの「公式URL」やエンドユーザーがブラウザに入力したものとは異なります(リバースプロキシ、フォワードプロキシ、内部ホスト名、IPアドレスなど)。
bzlm 2009

1
「公式URL」(IISからのもの)を取得する方法はありますか
マットミッチェル

回答:


186

MattMitchellの回答と同じですが、いくつか変更があります。代わりにデフォルトのポートをチェックします。

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

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

3
「:」の代わりに使用できる、.NETで定義されたフィールドはありますか?System.Uri.PortDelimiterのようなもの?ほら、一貫性のために。:)
Jan Aagaard、2011年

2
Jan Aagaardのことは知りませんが、ローカルでいつでも作成できます。私はほとんどの「魔法の」文字列と数値に対してそれを行います。さらに言えば、カルロスの回答では ""ではなくstring.Emptyを使用します;)
vbullinger

8
およびのRequest.Url.Authority代わりに、Korayemの提案どおりに使用できます。Request.Url.HostRequest.Url.Port
Schmalls 2012

4
文字列を連結する代わりに、System.UriBuilderクラスを使用する必要があります。
BrainSlugs83 2013年

3
@MattMitchell、それはAuthorityの問題を設立していないようです、それはHost + ":" + Portに相当します。ソースコードdotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/…を
Giuseppe Romagnuolo

40

あたりとしては、このリンクは良い出発点は次のとおりです。

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

ただし、ドメインがhttp://www.domainname.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は構成によって異なります。

そのためIsDefaultPortCarlosMuñozからの上記の承認済み回答のように使用する必要があります。


1
なぜここでポート80を想定するのですか?この仮定を外すと、コードは万能のように見えます。ポート80を想定すると、多くのシナリオで失敗します(他の回答についてのコメントを参照)。可能であればポート番号を削除する場合は、ポート番号が問題のスキームのデフォルトであること、およびスキームがデフォルトのポート番号をサポートしていることを確認する必要があります。
bzlm 2009

ええ、ポート80は悪い考えかもしれないという注意を見てください。これを回避する方法は他にありませんが、構成に依存する必要があると述べたのはこのためです。
Matt Mitchell、

1
これが役立つかどうかはわかりませんが、試してみることもできます。Request.IsSecureConnectionを使用して、HTTPSが使用されているかどうかを確認します。
エリックブラウン

1
@EricBrown-ええ、この答えは5年後の回顧ではあまり良くありません。私はその問題を回避するためにカルロス・ムニョスの受け入れられた答えを使います。
マットミッチェル

29
Request.Url.GetLeftPart(UriPartial.Authority)

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


23
彼らがその名前を思いついたとき、私は会議に参加したいです
。– Simon_Weaver

20

警告!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%しか発生しないので気付くのが非常に難しいバグだったので、「ノーダウ」と思っている人もいるかもしれません。P

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


まったく同じでした。私のドメインはweb.configにあります。
Korayem

私は考えていますが、私は理解して-あなたのサーバーはproxyfireを打つんなぜですか?それはあなたのサイトですか?ただし、全体的には理にかなっています。アプリケーション固有のイベント中にリクエスト固有のオブジェクトを使用すると、うまく機能しない場合があります。ページライフサイクルイベント(Page.LoadCompletedなど)などのリクエスト固有のイベントに危険はありますか?
mlhDev 2012年

それがプロキシファイアに解決された理由について、私はあまり深く調査しませんでした。それは確かに私のサイトではありませんでしたが、Current.Request.Urlが100%信頼できるものではなかったことを示していました。多くの調査の結果、複数のNICカード、IP、および同じIPに解決されるドメイン名が原因で、ホスト名を動的に決定することは容易ではないことも発見しました。あなたの他の質問マットに関しては、私はあなたが何を意味するのか
わかり

これはこれまでにApplication_BeginRequestでのみ発生しましたか?ホストヘッダーが設定されていない場合を除いて、IISがこの要求をアプリに送信した方法はわかりませんか?
Simon_Weaver 2013

@Thirlan-これに似た問題をデバッグしようとしています。Request.Url.Hostを使用してサブドメインを取得しようとしていますが、「通常」はうまく機能しますが、常にそうとは限りません。とにかくこれの周りに本当にありますか?リクエストの中で正しいと思われる何か他のものと同じですか?
scojomodena 14年

14

使ってみませんか

Request.Url.Authority

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

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


2
これも機能します。httpまたはhttpsを「数値化」するには、simlpyの前に「//」を置きます。したがって、たとえば、href = "// @ Request.Url.Authority ..."として読み取られます
EdwardM

2

シンプル短い方法(スキーマ、ドメイン、ポートをサポート):

使用する 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

1

別の方法:


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

シンプルだが素晴らしい答え!
Shiroy

1

どうですか:

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"];

0

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

-1

どうですか:

String domain = "http://" + Request.Url.Host

悪くはありませんが、サイトに安全なページがある場合(https://など)、ドメインがポート80でホストされていない場合はどうでしょうか。
マットミッチェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.