.NET-プロトコル、ホスト、ポートを取得する


229

.NETで現在のプロトコル、ホスト、ポートをすばやく取得する簡単な方法はありますか?たとえば、次のURLにいるとします。

http://www.mywebsite.com:80/pages/page1.aspx

戻る必要があります:

http://www.mywebsite.com:80

Request.Url.AbsoluteUri完全なURLを取得するために使用できること、およびRequest.Url.Authorityホストとポートを取得するために使用できることはわかっていますが、URL文字列を解析せずにプロトコルを取得する最善の方法がわかりません。

助言がありますか?


1
ここsimlar質問に対する私の答えを参照してください- stackoverflow.com/a/1534478/98740
WDuffy

回答:


172

次の(C#)コードでトリックを実行できます

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

26
または、リクエストされた文字列= uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq 2012年

17
ポートがない場合でも「:」が挿入されるため、これは間違いなく間違った答えです。Uri.GetLeftPart@dthrasherが指摘するように使用
gman

場合によっては、GetLeftPart()の代わりにuri.Headers ["Host"]と連結したい場合があることに注意してください。たとえば、プロキシの背後でサービスが異なる/非標準のポートでリッスンしている可能性があり、そのURLを(プライベートポートを使用した)コールバックは、ホストに到達できなくなります。
doveryai

408

@Rickにはこの質問に対する回答が受け入れられていますが、実際にはこれを行うには、名前が不十分なUri.GetLeftPart()メソッドを使用するより短い方法があります。

Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);

GetLeftPart()ただし、には1つの問題があります。ポートがスキームのデフォルトのポートである場合、それは取り除かれます。ポート80がhttpのデフォルトポートであるため、GetLeftPart()上記の例の出力はになりますhttp://www.mywebsite.com

ポート番号が80以外の場合、結果に含まれます。


12
これは私の意見では最良の例です。これは、localhost:portおよびライブインスタンスで機能します。
マフィンマン

13
GetLeftPart-本当に、OMGは素晴らしいネーミングです。
Valentin Kuzub 2015年

URLのこの部分に一般的に使用される名前があるかどうか誰かが知っていますか?JavaScriptでそれが起源と呼ばれていますが、普遍的に合意したということならば、私はよく分からない:serverfault.com/questions/757494/...
ディルク・ボーア

1
Microsoftはこれに「権限」という用語を使用していますが、それが標準的な用語であるかどうかはわかりません。stackoverflow.com/questions/2142910/…を
dthrasher

1
私は個人的には、Uriこの方法でクラスを使用することを好みません。このコンストラクタが例外をスローするケースは多数あります。ほとんどの場合、手元のタスクを中止する前に、コードをもう少し寛容にすることをお勧めします。
ジョナサンウッド

60

Asp.Netでこれを行っている場合、またはHttpContext.Current.Requestにアクセスできる場合は、これらを取得する方が簡単で一般的な方法だと思います。

var scheme = Request.Url.Scheme; // will get http, https, etc.
var host = Request.Url.Host; // will get www.mywebsite.com
var port = Request.Url.Port; // will get the port
var path = Request.Url.AbsolutePath; // should get the /pages/page1.aspx part, can't remember if it only get pages/page1.aspx

これがお役に立てば幸いです。:)


1
私はこの方法を好みます。必要な部分だけを取得でき、ポートを取得するのに十分な形式の文字列であるかどうかを心配する必要はありません。+1
ジュールド

これらのプロパティのいくつかの詳細:blog.jonschneider.com/2014/10/...
ジョン・シュナイダー

33

これを取得するためのより構造化された方法は、UriBuilderを使用することです。これにより、文字列を直接操作する必要がなくなります。

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);

23

Request.Urlは、リクエストのUriを返します。それを取得したら、必要なほとんどすべてのものを取得できます。プロトコルを取得するには、Schemeプロパティを呼び出します。

サンプル:

Uri url = Request.Url;
string protocol = url.Scheme;

お役に立てれば。


20

さらに短い方法では、新しいASP.Netが必要になる場合があります。

string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)

UriComponents列挙型を使用すると、URIのどのコンポーネントを含めるかを指定できます。


1
PCLで機能するため、すばらしい(.GetLeftPart()はそこで利用できません)
Sascha

10

ホルガーの答えとよく似ています。URLを取得する必要がある場合は、次のようなことができます。

Uri uri = Context.Request.Url;         
var scheme = uri.Scheme // returns http, https
var scheme2 = uri.Scheme + Uri.SchemeDelimiter; // returns http://, https://
var host = uri.Host; // return www.mywebsite.com
var port = uri.Port; // returns port number

ウリクラスは、メソッド、私がリストされていない多くの全範囲を提供します。

私のインスタンスでは、とLocalHost一緒に取得する必要がPort Numberあったので、これは私がやったことです:

var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 

うまく掴んだもの: http://localhost:12345

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.