.NET, protokol, ana bilgisayar ve bağlantı noktası alın


229

.NET'te geçerli protokolü, ana bilgisayarı ve bağlantı noktasını hızla almanın basit bir yolu var mı? Örneğin, aşağıdaki URL'deysem:

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

Geri dönmem gerekiyor:

http://www.mywebsite.com:80

Ben Request.Url.AbsoluteUritam URL almak için kullanabilirsiniz biliyorum , ve ben Request.Url.Authorityana bilgisayar ve bağlantı noktası almak için kullanabilirsiniz biliyorum , ama URL dizesini ayrıştırmadan protokolü almak için en iyi yolu emin değilim.

Baska öneri?


1
Burada bir simlar soruya cevabımı görebilirsiniz - stackoverflow.com/a/1534478/98740
WDuffy

Yanıtlar:


172

Aşağıdaki (C #) kodu hile yapmalıdır

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

26
Veya istenen dizgi = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq

17
Bu, bağlantı noktası olmasa bile bir ":" ekleyeceği için tartışmasız yanlış cevaptır. Kullanım Uri.GetLeftPartdışarı @dthrasher noktaları olarak
Gman

Bazı durumlarda, GetLeftPart () yerine hala uri.Headers ["Host"] ile birleştirmek istediğinizi, örneğin bir proxy'nin arkasında hizmetinizin farklı / standart olmayan bir bağlantı noktasını dinliyor olabileceğini ve bu URL'yi (özel bağlantı noktasıyla birlikte) bir ana bilgisayara erişilemez.
doveryai

408

@Rick'in bu soru için kabul edilen cevabı olsa da, aslında kötü adlandırılmış Uri.GetLeftPart()yöntemi kullanarak bunu yapmanın daha kısa bir yolu var .

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

GetLeftPart()Ancak , bir yakalama var . Bağlantı noktası şema için varsayılan bağlantı noktasıysa, onu çıkarır. 80 numaralı bağlantı noktası http için varsayılan bağlantı noktası olduğundan, GetLeftPart()yukarıdaki örneğimin çıktısı olacaktır http://www.mywebsite.com.

Bağlantı noktası numarası 80 dışında bir şey olsaydı, sonuca dahil edilirdi.


12
Bu bence en iyi örnek. Localhost için çalışır: bağlantı noktası ve canlı örnekler.
Muffin Man

13
GetLeftPart - gerçekten, OMG güzel adlandırma.
Valentin Kuzub

URL'nin bu bölümünün ortak kullanılan bir adı olup olmadığını bilen var mı? JavaScript'te Origin denir, ancak bunun evrensel olarak kabul edilip edilmediğinden emin değilim: serverfault.com/questions/757494/…
Dirk Boer

1
Microsoft bunun için "Yetki" terimini kullanır, ancak bunun standart bir terim olup olmadığını bilmiyorum. Bkz. Stackoverflow.com/questions/2142910/…
dthrasher

1
Şahsen Urisınıfı bu şekilde kullanmayı sevmiyorum . Bu kurucunun bir istisna atacağı çok sayıda durum vardır. Çoğu durumda, elimdeki görevi iptal etmeden önce kodumun biraz daha affedici olmasını tercih ederim.
Jonathan Wood

60

Peki bunu Asp.Net'te yapıyorsanız veya HttpContext.Current.Request'e erişiyorsanız, bunların daha kolay ve daha genel bir yol olduğunu söyleyebilirim:

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

Umarım bu yardımcı olur. :)


1
Ben bu yöntemi tercih, ben sadece istediğiniz peice alabilirsiniz ve dize bağlantı noktası almak için yeterince iyi biçimlendirilmiş olup olmadığını endişelenmenize gerek yok. +1
Jrud

Bu özellikler hakkında daha fazla bilgi: blog.jonschneider.com/2014/10/…
Jon Schneider

33

Bunu yapmanın daha yapılandırılmış bir yolu UriBuilder kullanmaktır. Bu, doğrudan dize manipülasyonunu önler.

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

23

Request.Url size isteğin Uri değerini döndürür . Bunu yaptıktan sonra, istediğiniz hemen her şeyi alabilirsiniz. Protokolü almak için, çağrı Şeması özelliğini .

Örneklem:

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

Bu yardımcı olur umarım.


20

Daha kısa bir yol için daha yeni ASP.Net gerekebilir:

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

UriComponents enum'u, URI'nin hangi bileşenlerini dahil etmek istediğinizi belirtmenize olanak tanır.


1
Harika, çünkü PCL'de çalışıyor (.GetLeftPart () orada mevcut değil)
Sascha

10

Holger'in cevabına çok benzer. URL'yi almanız gerekiyorsa aşağıdaki gibi bir şey yapabilirsiniz:

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

Uri sınıf I listelemediğim yöntemlerin bir dizi, birçok sağlar.

Benim durumumda, LocalHostile birlikte kapmak gerekiyordu Port Number, bu yüzden yaptım:

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

Hangi başarıyla yakalandı: http://localhost:12345

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.