Uri.Host और Uri.Authority में क्या अंतर है


86

System.Uriहै Host, Authorityऔर DnsSafeHost। MS कब Hostऔर DnsSafeHostकैसे अलग हैं, इसका एक अच्छा उदाहरण देता है

मैं इसके लिए एक समान उदाहरण / स्पष्टीकरण चाहता हूं Hostऔर Authority

जवाबों:


105

हां ब्रैंडन बिल्कुल सही है, आम शब्दों में

प्राधिकरण = मेजबान का नाम + पोर्ट नहीं

और यदि URL प्रोटोकॉल एक डिफ़ॉल्ट पोर्ट का उपयोग कर रहा है, तो http URL के लिए पोर्ट 80 कहें, तो केवल उस मामले में प्राधिकरण = होस्ट नाम (पोर्ट संख्या 80 माना जाता है),

जबकि Host Name या तो Domain Name या IP Address होता है

उदाहरण:

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

    प्राधिकरण = www.example.com
    होस्ट नाम = www.example.com

  2. http://255.255.255.255:8080/

    प्राधिकरण = 255.255.255.255:8080
    होस्ट नाम = 255.255.255.255


1
एक छोटा सा संदेह। अगर मैं लोकलहोस्ट में एप्लिकेशन चलाता हूं तो मेरे URL में पोर्ट नंबर है, लेकिन उत्पादन में मेरे पास URL में पोर्ट नंबर नहीं है। तो, मैं स्वतंत्र रूप से Url.Authority का उपयोग कर सकते हैं? मेरा मतलब है कि अगर पोर्ट नंबर नहीं है तो URl.Authority URL के समान कार्य करेगा। यह सही है। मेरा मतलब है कि मैं अभी भी URL को सही तरीके से प्राप्त कर सकूंगा? कृपया मेरा मार्गदर्शन करें,।
अटूट

पढ़ें stackoverflow.com/a/39415643/316343 , यह User Informationहिस्सा याद किया ।
जहान

क्या इस उत्तर के लिए कोई दस्तावेज़ीकरण संदर्भ है? कुछ आधिकारिक?
जोनाथन एम

35

MSDN URI.Host पेज से।

प्राधिकरण संपत्ति के विपरीत, इस संपत्ति मूल्य में पोर्ट नंबर शामिल नहीं है।


एक छोटा सा संदेह। अगर मैं लोकलहोस्ट में एप्लिकेशन चलाता हूं तो मेरे URL में पोर्ट नंबर है, लेकिन उत्पादन में मेरे पास URL में पोर्ट नंबर नहीं है। तो, मैं स्वतंत्र रूप से Url.Authority का उपयोग कर सकते हैं? मेरा मतलब है कि अगर पोर्ट नंबर नहीं है तो URl.Authority URL के समान कार्य करेगा। यह सही है। मेरा मतलब है कि मैं अभी भी URL को सही तरीके से प्राप्त कर सकूंगा? कृपया मेरा मार्ग दर्शन कीजिए।
अटूट

@ प्रचलित - यह सही है कि यह दोनों मामलों के लिए काम करेगा। जब आप url में पोर्ट नंबर निर्दिष्ट नहीं करते हैं तो आप केवल डिफ़ॉल्ट एक का उपयोग करते हैं और उस स्थिति में Url.Authority पोर्ट को छोड़ देता है।
बॉर्नटूकोड

17

प्रत्येक HTTP URL एक सामान्य URI के सिंटैक्स के अनुरूप है। URI जेनेरिक सिंटैक्स में पाँच घटकों का एक श्रेणीबद्ध अनुक्रम होता है:

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

जहां प्राधिकरण घटक तीन उप-खंडों में विभाजित होता है:

authority = [userinfo@]host[:port]

ऐशे ही:

विकि

दो स्लैश (//) से पहले एक वैकल्पिक प्राधिकरण घटक, जिसमें शामिल हैं:

  • एक वैकल्पिक userinfo उपसमुच्चय जिसमें एक उपयोगकर्ता नाम और एक कोलोन (:) से पहले एक वैकल्पिक पासवर्ड शामिल हो सकता है, एक प्रतीक (@) द्वारा पीछा किया जाता है। प्रारूप उपयोक्तानाम का उपयोग: उपयोक्ता में उपयोक्तानाम सुरक्षा कारणों से पदावनत है। एप्लिकेशन को पहले कॉलोन के बाद किसी भी डेटा को स्पष्ट पाठ के रूप में प्रस्तुत नहीं करना चाहिए (:) एक उपयोक्ता के भीतर पाया जाता है जब तक कि उपनिवेश के बाद का डेटा खाली स्ट्रिंग (कोई पासवर्ड नहीं दर्शाता)।
  • एक वैकल्पिक मेजबान उपसंपादक, जिसमें एक पंजीकृत नाम (एक होस्टनाम तक सीमित नहीं है), या एक आईपी पते शामिल है। IPv4 पते को डॉट-दशमलव संकेतन में होना चाहिए, और IPv6 पतों को कोष्ठक ([]) में संलग्न किया जाना चाहिए।
  • एक वैकल्पिक बंदरगाह एक उपनिवेश से पहले उपनिवेश (:)।

अधिक जानकारी के लिए, आप https://en.wikipedia.org/wiki/URL का संदर्भ ले सकते हैं ।


12

.NET में Uri वर्ग के लिए, प्राधिकरण में पोर्ट, होस्ट शामिल नहीं है, और न ही उपयोगकर्ता जानकारी शामिल है।

वैध यूआरआई के कुछ उदाहरण:

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));

RFC3986 के अनुसार , धारा 3.2 में प्राधिकरण शामिल है

  1. उपयोगकर्ता के लिए जानकारी
  2. मेज़बान
  3. पोर्ट संख्या।

सिर्फ होस्ट और पोर्ट नंबर नहीं।

उदाहरण के लिए, निम्नलिखित एक मान्य URI है:

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

जिसमें प्राधिकरण है

user:password@host:80

प्रतीक पर (@) होस्ट और उपनिवेश से उपयोगकर्ता जानकारी को हटाता है (:) पोर्ट नंबर से होस्ट को परिसीमित करता है। उपयोगकर्ता जानकारी के भीतर, एक बृहदान्त्र (:) पासवर्ड से उपयोगकर्ता नाम का परिसीमन करता है। (हां, मुझे पता है कि पासवर्ड का भाग हटा दिया गया है। यह अभी भी वैकल्पिक रूप से समर्थित हो सकता है।)

यह एक प्राधिकरण के लिए पूर्ण कल्पना है। जाहिर है, उपयोगकर्ता जानकारी और पोर्ट नंबर अक्सर मौजूद नहीं होते हैं।

.NET में उरी वर्ग उपयोगकर्ता जानकारी चला जाता है जब प्राधिकरण जो बल्कि कष्टप्रद है, क्योंकि यह सही नहीं है लौटने। इसके बजाय आप उपयोगकर्ता जानकारी को UserInfo गुण में पा सकते हैं:

Uri.UserInfo

अन्य उत्तर तकनीकी रूप से यह कहना सही है कि .NET Uri वर्ग के लिए कि Uri.Authority और Uri.Host के बीच अंतर यह है कि होस्ट में पोर्ट नंबर नहीं होगा।

लेकिन कृपया जान लें कि प्राधिकरण को ठीक से परिभाषित नहीं किया गया है। इसका उपयोग .NET Uri वर्ग में किया जाता है क्योंकि इसमें उपयोगकर्ता जानकारी भी हो सकती है।


10

आपके द्वारा लिंक किए गए दस्तावेज़ के अनुसार, Authorityसंपत्ति में पोर्ट नंबर शामिल होगा यदि यह उरी के डिफ़ॉल्ट पोर्ट के समान नहीं है, जबकि Hostसंपत्ति केवल DNS होस्ट नाम या आईपी पता वापस करेगी।

मेरा मानना ​​है कि इससे ज्यादा अंतर नहीं हैं।


1
एक छोटा सा संदेह। अगर मैं लोकलहोस्ट में एप्लिकेशन चलाता हूं तो मेरे URL में पोर्ट नंबर है, लेकिन उत्पादन में मेरे पास URL में पोर्ट नंबर नहीं है। तो, मैं स्वतंत्र रूप से Url.Authority का उपयोग कर सकते हैं? मेरा मतलब है कि अगर पोर्ट नंबर नहीं है तो URl.Authority URL के समान कार्य करेगा। यह सही है। मेरा मतलब है कि मैं अभी भी URL को सही तरीके से प्राप्त कर सकूंगा? कृपया मेरा मार्ग दर्शन कीजिए।
अटूट

0

प्राधिकरण में एक उपयोगकर्ता नाम और पासवर्ड भी शामिल हो सकता है, जैसे

बॉब: pwd@somewhere.example.com

अधिक सामान्यतः FTP URI के लिए उपयोग किया जाता है


क्षमा करें, आप गलत हैं। RFC 3986 सेक्शन 3.2 अथॉरिटी "अथॉरिटी = [userinfo" @ "] होस्ट [": "पोर्ट]"
एड्रियन

सादे पासवर्ड के साथ उपयोगकर्ता जानकारी RFC में निकाली गई है, लेकिन अभी भी आम उपयोग में है, विशेष रूप से FTP URI के साथ, और IE अभी भी इसका समर्थन करता है (वास्तव में यह एक HTTP प्रॉक्सी के माध्यम से IE के माध्यम से FTP के साथ स्थापित करने का एकमात्र तरीका है)।
एड्रियन

4
सवाल System.URI.Authority के बारे में है, जो RFC 3986 के समान नहीं है।
ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.