ASP.NETで現在のドメイン名を取得する方法


82

asp.net c#で現在のドメイン名を取得したい。

私はこのコードを使用しています。

string DomainName = HttpContext.Current.Request.Url.Host;

私のURLはですlocalhost:5858が、返されるのはlocalhost。だけです。

現在、ローカルホストでプロジェクトを使用しています。localhost:5858を取得したい。

別の例として、このドメインを使用している場合

www.somedomainname.com

私は手に入れたい somedomainname.com

現在のドメイン名を取得する方法を教えてください。


1
ホスト名とドメイン名は2つの異なるものです。特定のIPアドレス、またはそれが実行されているマシンのホスト名にマップされているドメインが必要ですか?
ロブグッドウィン


var base_url = "@ Request.Url.GetLeftPart(UriPartial.Authority)@ Url.Content("〜/ ")"
Prince Prasad

回答:


75

使用Request.Url.Hostは適切ですHost:-HTTPリクエストのリソースパス部分にはホスト名が含まれていないため、UA(ブラウザ)が必要とするホスト名(ドメイン名)を指定するHTTPヘッダーの値を取得する方法です。

localhost:5858これはドメイン名ではなく、「オーソリティ」とも呼ばれるエンドポイント指定子であり、ホスト名とTCPポート番号が含まれていることに注意してください。これは、にアクセスすることで取得されますRequest.Uri.Authority

さらに、それは取得することは有効ではありませんsomedomain.comから、www.somedomain.comWebサーバがために別のサイトに役立つように構成することができるので、www.somedomain.com比較にをsomedomain.com使用していますが、しかし、あなたは必ずこれはあなたのケースで有効であるあるならば、あなたは、手動でホスト名を解析する必要がありますString.Split('.')で作品をピンチ。

Webサーバー(IIS)の構成はASP.NETの構成とは異なり、ASP.NETは、実際には、実行されているWebサイトおよびWebアプリケーションのHTTPバインディング構成を完全に認識していないことに注意してください。IISとASP.NETの両方が同じ構成ファイル(web.config)を共有しているという事実は、厄介な問題です。


112

次のように、URLの「左側」を取得してみてください。

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

これにより、ローカルまたは本番のどちらをhttp://localhost:5858使用しているhttps://www.somedomainname.comかがわかります。wwwパーツを削除する場合は、IISを構成する必要がありますが、それは別のトピックです。

結果のURLにはスラッシュが付いていないことに注意してください。


7
これは私の意見では最良の答えになるはずです。
アンドリュー

これは私のニーズに見事に機能しました。ただし、小さな修正が1つあります。権限部分を要求すると、返される文字列には末尾のパス区切り文字が含まれません。したがって:http://localhost:60333
ウィル

1
VaRのBASE_URL = "@ Request.Url.GetLeftPart(UriPartial.Authority)@ Url.Content(" 〜/ ")"
プリンス・プラサド

これは、Asp.Net Core2.2では機能していないようです。'HttpContext'に 'Current'の定義が含まれておらず、タイプ 'HttpContext'の最初の引数を受け入れるアクセス可能な拡張メソッド 'Current'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)。
stianJun

@Stianどうやら、すでにそれに答えている別の投稿があります:stackoverflow.com/questions/31243068/…。この回答は、URI部分のみに焦点を当てています。
アルトゥーロ・トレス・サンチェス

39

これがのスクリーンショットです Request.RequestUriすべての人が参照できるようにとそのすべてのプロパティです。

ここに画像の説明を入力してください


18

次のコードを試すことができます:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)

6

www.somedomain.com あるドメイン/ホストが。サブドメインは重要な部分です。www.多くの場合、1つがない場合と同じ意味で使用されますが、同等ではないため、原則として(デフォルトで設定されている場合でも)設定する必要があります。のような別のサブドメインについて考えてみてくださいmx.。それはおそらくとは異なるターゲットを持っていwww.ます。

それを考えると、私はこの種のことをしないことをお勧めします。そうは言っても、あなたが尋ねているので、私はあなたが正当な理由があると思います。

個人的には、www.このための特別なケースをお勧めします。

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

あなたは切り落とすたいことを確認し、本当に100%ならそれ以外の場合は、任意のサブドメインを、あなたは少しはもっと複雑なものが必要になります。

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

ポートを取得することは、他の人が言っているのと同じです。


1

HttpContext.Current.Request.Url.Hostが正しい値を返しています。www.somedomainname.comで実行すると、www.somedomainname.comが表示されます。5858も入手したい場合は、使用する必要があります

HttpContext.Current.Request.Url.Port 

1

Request.ServerVariablesオブジェクトは、私のために動作します。使わない理由はわかりません。

ServerVariables["SERVER_NAME"]そしてServerVariables["HTTP_URL"]あなたが探しているものを手に入れるべきです


1

次のコードを試して、完全修飾ドメイン名を取得できます。

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

4
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来読者のために質問に答えていることを忘れないでください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
ロブ・ラング博士2017年

1

URLの名前を取得する簡単な方法は次のとおりです。

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }


-1

サブドメインでもMVCでベースURLを取得するにはwww.somedomain.com/subdomain

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.