.NET - Dapatkan protokol, host, dan port

229

Apakah ada cara sederhana di .NET untuk dengan cepat mendapatkan protokol, host, dan port saat ini? Misalnya, jika saya menggunakan URL berikut:

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

Saya harus kembali:

http://www.mywebsite.com:80

Saya tahu saya bisa menggunakannya Request.Url.AbsoluteUri untuk mendapatkan URL yang lengkap, dan saya tahu saya dapat menggunakan Request.Url.Authorityuntuk mendapatkan host dan port, tetapi saya tidak yakin tentang cara terbaik untuk mendapatkan protokol tanpa menguraikan string URL.

Ada saran?

Jeremy
sumber
1
Lihat jawaban saya untuk pertanyaan simlar di sini - stackoverflow.com/a/1534478/98740
WDuffy

Jawaban:

172

Kode (C #) berikut harus melakukan trik

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Rick
sumber
26
Atau string yang diminta = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq
17
Ini bisa dibilang jawaban yang salah karena akan memasukkan ":" bahkan ketika tidak ada port. Gunakan Uri.GetLeftPartseperti yang ditunjukkan oleh @dthrasher
gman
Perhatikan bahwa dalam beberapa kasus, Anda masih ingin menyatukan dengan uri.Headers ["Host"] alih-alih GetLeftPart (), misalnya di belakang proxy layanan Anda mungkin mendengarkan pada port yang berbeda / non-standar dan jika Anda menggunakan url di panggilan balik (dengan port pribadi) tuan rumah tidak akan terjangkau.
doveryai
408

Meskipun @Rick memiliki jawaban yang diterima untuk pertanyaan ini, sebenarnya ada cara yang lebih pendek untuk melakukan ini, menggunakan metode yang tidak disebutkan namanya Uri.GetLeftPart().

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

Namun, ada satu tangkapan untuk GetLeftPart(). Jika port adalah port default untuk skema, itu akan menghapusnya. Karena port 80 adalah port default untuk http, output GetLeftPart()dalam contoh saya di atas akan menjadihttp://www.mywebsite.com .

Jika nomor port adalah sesuatu selain 80, itu akan dimasukkan dalam hasilnya.

dthrasher
sumber
12
Ini adalah contoh terbaik menurut saya. Ini berfungsi untuk localhost: port dan instance langsung.
The Muffin Man
13
GetLeftPart - sungguh, penamaan bagus OMG.
Valentin Kuzub
Adakah yang tahu jika bagian url ini memiliki nama yang umum digunakan? Dalam JavaScript itu disebut Origin, tapi saya tidak yakin apakah itu disetujui secara universal: serverfault.com/questions/757494/…
Dirk Boer
1
Microsoft menggunakan istilah "Otoritas" untuk ini, tetapi saya tidak tahu apakah itu istilah standar. Lihat stackoverflow.com/questions/2142910/…
dthrasher
1
Saya pribadi tidak suka menggunakan Urikelas dengan cara ini. Ada banyak kasus di mana konstruktor ini akan memberikan pengecualian. Untuk sebagian besar kasus, saya lebih suka kode saya sedikit lebih memaafkan sebelum membatalkan tugas yang ada.
Jonathan Wood
60

Baik jika Anda melakukan ini di Asp.Net atau memiliki akses ke HttpContext.Current.Request Saya akan mengatakan ini adalah cara yang lebih mudah dan lebih umum untuk mendapatkannya:

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

Saya harap ini membantu. :)

Holger
sumber
1
Saya lebih suka metode ini, saya bisa mendapatkan suatu bagian yang saya inginkan dan tidak perlu khawatir tentang apakah string cukup baik terbentuk untuk mendapatkan port. +1
Jrud
Beberapa perincian lebih lanjut tentang properti-properti ini: blog.jonschneider.com/2014/10/...
Jon Schneider
33

Cara yang lebih terstruktur untuk mendapatkan ini adalah dengan menggunakan UriBuilder. Ini menghindari manipulasi string langsung.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Haonan Tan
sumber
23

Request.Url akan mengembalikan Uri dari permintaan Anda. Setelah Anda memilikinya, Anda dapat mengambil hampir semua yang Anda inginkan. Untuk mendapatkan protokol, hubungi Skema properti .

Sampel:

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

Semoga ini membantu.

Dale Ragan
sumber
20

Cara yang lebih pendek, mungkin memerlukan ASP.Net yang lebih baru:

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

Enum UriComponents memungkinkan Anda menentukan komponen URI mana yang ingin Anda sertakan.

Mark Shapiro
sumber
1
Hebat, karena berfungsi di PCL (.GetLeftPart () tidak tersedia di sana)
Sascha
10

Sangat mirip dengan jawaban Holger. Jika Anda perlu mengambil URL dapat melakukan sesuatu seperti:

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

Kelas Uri menyediakan berbagai macam metode, banyak yang belum saya sebutkan.

Dalam contoh saya, saya perlu LocalHostmengikuti Port Number, jadi inilah yang saya lakukan:

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

Yang berhasil meraih: http://localhost:12345

benscabbia
sumber