Uri.Host ve Uri arasındaki fark nedir.


86

System.Urivardır Host, Authorityve DnsSafeHost. MS burada ne zaman Hostve ne zaman DnsSafeHostfarklı olduğuna dair güzel bir örnek sunar .

Ben için de benzer bir örnek / açıklama bekliyorum Hostve Authority.

Yanıtlar:


105

Evet Brandon, meslekten olmayanlar açısından kesinlikle haklı

Yetki = Ana Bilgisayar Adı + Bağlantı Noktası No

Ve URL protokolü varsayılan bir bağlantı noktası kullanıyorsa, http URL için bağlantı noktası 80 diyelim, o zaman sadece bu durumda Yetkili = Ana Bilgisayar Adı (Bağlantı Noktası No 80 olarak varsayılır),

Ana Bilgisayar Adı, Alan Adı veya IP Adresidir

Misal:

  1. http://www.example.com/

    Yetki = www.example.com
    Ana Bilgisayar Adı = www.example.com

  2. http://255.255.255.255:8080/

    Yetki = 255.255.255.255:8080
    Ana Bilgisayar Adı = 255.255.255.255


1
Küçük bir şüphe. uygulamayı localhost'ta çalıştırırsam URL'mde bağlantı noktası numaram var, ancak üretimde URL'de bağlantı noktası numaram yok. Yani, Url.Authority'yi özgürce kullanabilir miyim? Demek istediğim, port numarası orada değilse URl.Authority, URL.Host right ile aynı şekilde davranacaktır. Demek istediğim, URL'yi yine de doğru bir şekilde alabileceğim mi? Lütfen bana yol göster,.
Unbreakable

Stackoverflow.com/a/39415643/316343'ü okuyun , User Informationbölümü kaçırdı .
Cihan

Bu cevap için bir dokümantasyon referansı var mı? Otoriter bir şey mi?
Jonathan M

35

MSDN URI.Host sayfasından.

Authority özelliğinden farklı olarak, bu özellik değeri bağlantı noktası numarasını içermez.


Küçük bir şüphe. uygulamayı localhost'ta çalıştırırsam URL'mde bağlantı noktası numaram var, ancak üretimde URL'de bağlantı noktası numaram yok. Yani, Url.Authority'yi özgürce kullanabilir miyim? Demek istediğim, port numarası orada değilse URl.Authority, URL.Host right ile aynı şekilde davranacaktır. Demek istediğim, URL'yi yine de doğru bir şekilde alabileceğim mi? Lütfen bana yol göster.
Unbreakable

@Unbreakable - Bu doğru her iki durumda da işe yarayacak. URL'de bağlantı noktası numarasını belirtmediğinizde, yalnızca varsayılanı kullanırsınız ve bu durumda URL'yi kullanırsınız. Yetki, bağlantı noktasını atlar.
BornToCode

17

Her HTTP URL'si, genel bir URI'nin sözdizimine uygundur. URI genel sözdizimi, beş bileşenden oluşan hiyerarşik bir diziden oluşur:

URI = scheme:[//authority]path[?query][#fragment]

nerede makam üç alt bileşenden içine bileşen böler:

authority = [userinfo@]host[:port]

Bunun gibi:

wiki

Önünde iki eğik çizgi (//) bulunan isteğe bağlı bir yetki bileşeni, aşağıdakileri içerir:

  • İsteğe bağlı bir userinfo alt bileşen, bir kullanıcı adı ve sembol (bir, ardından iki nokta (:) öncesinde, isteğe bağlı bir şifre meydana gelebilir @). Kullanıcı bilgisi alt bileşeninde kullanıcı adı: şifre biçiminin kullanılması güvenlik nedenleriyle kullanımdan kaldırılmıştır. Uygulamalar, iki nokta üst üste işaretinden sonraki veriler boş dize olmadığı sürece (parola olmadığını belirten), bir userinfo alt bileşeninde bulunan ilk iki noktadan (:) sonra bulunan verileri açık metin olarak oluşturmamalıdır.
  • Kayıtlı bir ad (bir ana bilgisayar adı dahil ancak bununla sınırlı olmamak üzere) veya bir IP adresinden oluşan isteğe bağlı bir ana bilgisayar alt bileşeni. IPv4 adresleri noktalı ondalık gösterimde olmalı ve IPv6 adresleri parantez ([]) içine alınmalıdır.
  • Önünde iki nokta üst üste (:) bulunan isteğe bağlı bir bağlantı noktası alt bileşeni.

Daha fazla ayrıntı için https://en.wikipedia.org/wiki/URL adresine başvurabilirsiniz .


12

.NET'teki Uri sınıfı için, Otorite bağlantı noktasını içerir, Ana Bilgisayar içermez ve kullanıcı bilgilerini içermez.

Bazı geçerli URI örnekleri:

Uri u = new Uri("http://www.domain.com/path");
Assert.AreEqual("www.domain.com", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com", u.GetLeftPart(UriPartial.Authority));

u = new Uri("http://www.domain.com:8080/path");
Assert.AreEqual("www.domain.com:8080", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com:8080", u.GetLeftPart(UriPartial.Authority));

u = new Uri("http://user:password@host:555/path");
Assert.AreEqual("host:555", u.Authority);
Assert.AreEqual("host", u.Host);
Assert.AreEqual("http://user:password@host:555", u.GetLeftPart(UriPartial.Authority));

Göre RFC3986 , Kısım 3.2 Yetki içeriyor

  1. Kullanıcı bilgisi
  2. Ev sahibi
  3. Port numarası.

Yalnızca ana bilgisayar ve bağlantı noktası numarası DEĞİL.

Örneğin, aşağıdaki geçerli bir URI'dir:

http://user:password@host:80/path

Kurumun bulunduğu

user:password@host:80

(@) Simgesi, kullanıcı bilgilerini ana bilgisayardan ayırır ve iki nokta (:) ana bilgisayarı bağlantı noktası numarasından ayırır. Kullanıcı bilgisinin içinde, iki nokta üst üste (:) kullanıcı adını paroladan ayırır. (Evet, şifre bölümünün kullanımdan kaldırıldığını biliyorum. Yine de isteğe bağlı olarak desteklenebilir.)

Bu, bir Otorite için tam özelliktir. Açıktır ki, kullanıcı bilgisi ve port numarası çoğu zaman mevcut değildir.

NET'te Uri sınıf kullanıcı bilgilerini düşer doğru değil çünkü oldukça rahatsız edici Yetkilisi döndürürken. Bunun yerine, kullanıcı bilgilerini UserInfo özelliğinde bulabilirsiniz:

Uri.UserInfo

.NET Uri sınıfı için Uri.Authority ve Uri.Host arasındaki farkın ana bilgisayarın bir bağlantı noktası numarası içermeyeceğini söylemek için diğer yanıtlar teknik olarak doğrudur .

Ancak lütfen Authority'nin .NET Uri sınıfında kullanıldığı şekilde doğru şekilde tanımlanmadığını bilin, çünkü kullanıcı bilgilerini de içerebilir.


10

Bağlandığınız belgelere göre, Authorityözellik Uri'nin varsayılan bağlantı noktasıyla aynı değilse bağlantı noktası numarasını içerecek, Hostözellik ise yalnızca DNS Ana Bilgisayar adını veya IP Adresini döndürecektir.

Bundan daha fazla farklılık olduğuna inanmıyorum.


1
Küçük bir şüphe. uygulamayı localhost'ta çalıştırırsam URL'mde bağlantı noktası numaram var, ancak üretimde URL'de bağlantı noktası numaram yok. Yani, Url.Authority'yi özgürce kullanabilir miyim? Demek istediğim, port numarası orada değilse URl.Authority, URL.Host right ile aynı şekilde davranacaktır. Demek istediğim, URL'yi yine de doğru bir şekilde alabileceğim mi? Lütfen bana yol göster.
Unbreakable

0

Yetkili ayrıca bir kullanıcı adı ve şifre içerebilir, örn.

bob: pwd@somewhere.example.com

daha yaygın olarak FTP URI'leri için kullanılır


üzgünüm, yanılıyorsun. RFC 3986 bölüm 3.2 Yetki "yetki = [kullanıcı bilgisi" @ "] ana bilgisayar [": "bağlantı noktası]"
Adrien

düz şifreli kullanıcı bilgileri RFC'de kullanımdan kaldırılmıştır, ancak özellikle FTP URI'larında hala yaygın olarak kullanılmaktadır ve IE bunu hala desteklemektedir (aslında bir http proxy aracılığıyla IE aracılığıyla FTP ile kimlik doğrulamanın tek yolu budur).
Adrien

4
Soru System.URI.Authority ile ilgili, ki bu RFC 3986 ile aynı DEĞİLDİR.
Brian
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.