.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.