2010-01-27 16 views
6

कोड की निम्न पंक्ति एक अपवाद देता है। क्या यह ढांचे में एक बग है? यदि नहीं, तो मैं इसके बजाय क्या दृष्टिकोण ले सकता हूं?उरी में कोलन ":" क्यों उरी को पारित किया गया। मेकरेलेटिव यूरी अपवाद का कारण बनता है?

यह प्रतीत हो रहा है ":" (कोलन) कि इस मुद्दे में का कारण बनता है, फिर भी मैं देख रहा हूँ इस तरह के एक यूआरआई ठीक उत्पादन वेबसाइटों पर काम कर

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xx:yy")); 
// gives => System.UriFormatException: A relative URI cannot be created because the 
// 'uriString' parameter represents an absolute URI 

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xxyy")); 
// this works - removed the colon between the xx and yy 
(यानी असली दुनिया में एक वैध यूआरआई हो रहा है) है

पीएस। विशेष रूप से मैं यह पूछ सकता हूं कि उपर्युक्त मामला है, क्या (एन) पृष्ठ यूआरआई और (बी) एचटीएमएल से संबंधित स्ट्रिंग लेने के लिए मैं .NET क्लास/विधि का उपयोग कर सकता हूं (ध्यान में कि मैं वेब से एक HTML पृष्ठ पार्स कर रहा हूं) एचआरईएफ तर्क [उदाहरण के लिए इस मामले में "/ xx: yy" होता और] उस यूआरआई को वापस लौटाता है जिसे उस संसाधन को संबोधित करने के लिए इस्तेमाल किया जा सकता है?

दूसरे शब्दों में मैं ऐसे ब्राउज़र के व्यवहार की नकल कैसे करूं जो एचआरईएफ और पृष्ठ यूआरआई का अनुवाद यूआरआई का उत्पादन करने के लिए करता है, जब आप उस पर क्लिक करते समय उस संसाधन पर जाने के लिए उपयोग करते हैं।

+1

जॉन पोस्टेल: "जो भी आप स्वीकार करते हैं उसमें उदार रहें, और जो भी आप भेजते हैं उसमें रूढ़िवादी"। कृपया आरएफसी और उसके अनुच्छेद संख्या का उद्धरण दें जो प्रमाणित करता है कि यह एक वैध यूआरआई है। –

उत्तर

5

मैं इसे एक बग मानता हूं।

आरएफसी 1738 कहता है कि : (अन्य पात्रों के साथ) किसी योजना के भीतर विशेष अर्थ के लिए आरक्षित किया जा सकता है। हालांकि http योजना पथ हिस्सा

Within the <path> and <searchpart> components, "/", ";", "?" are reserved. 

में यह आरक्षित नहीं है (नहीं :।)

hsegment  = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 

तो, http://test.com/xx:yy एक वैध यूआरआई है। नए RFC3968 इससे सहमत हैं:

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 

हालांकि बेशक, http://test.com/asdf के खिलाफ relativised की, उसके एवज में xx:yy एक निरपेक्ष यूआरआई और एक मान्य सापेक्ष URI होगा:

path-noscheme = segment-nz-nc *("/" segment) 
segment-nz-nc = 1*(unreserved/pct-encoded/sub-delims/"@") 
       ; non-zero-length segment without any colon ":" 

तो MakeRelativeUri रिपोर्ट करने के लिए सही की तरह है एक समस्या है, लेकिन वास्तव में यह : एन्कोडिंग द्वारा स्वचालित रूप से इसे ठीक कर रहा है जो एक पूर्ण यूआरआई में एक %3A पर मान्य है जो एक सापेक्ष यूआरआई के पहले खंड में मान्य है।

मैं आमतौर पर रूट-रिश्तेदार यूआरआई के पक्ष में MakeRelativeUri से बचने की कोशिश करता हूं, जो निकालने में आसान होता है और यह समस्या नहीं होती है (/xx:yy ठीक है)।

+0

में मदद करेगा, यह बहुत अच्छा है - क्या आप सीधे .NET के बारे में जानते हैं विधि जो रूट-रिश्तेदार यूआरआई को पेजूरि + एचआरफस्ट्रिंग से देती है? बस इस समय एक की तलाश है ... या क्या आपको "इसे स्वयं करना" है? – Greg

+0

असल में मुझे इसके लिए एक नया प्रश्न शुरू करना चाहिए और इसे समाप्त होने के रूप में चिह्नित करना चाहिए ... मैं यह करूंगा – Greg

+0

http://stackoverflow.com/questions/2144150/c-question-how-do पर यह विशिष्ट प्रश्न बनाया -आई-कन्वर्ट-ए-पेजुरी-href-to-an-absolute-url-uri – Greg

1

कॉलन यूआरएल में एक विशेष भूमिका निभाते हैं - उदाहरण के लिए बंदरगाह को इंगित करने के लिए और 'आरक्षित' (see here) के लिए हैं।

यूआरएल विशेष वाक्य के लिए उनके वाक्यविन्यास को परिभाषित करने के लिए कुछ वर्णों का उपयोग करते हैं। इन पात्रों एक यूआरएल के अंदर उनके विशेष भूमिका में इस्तेमाल नहीं कर रहे हैं, वे

तो, पेट के भाग निकले जाना चाहिए एन्कोड करने की जरूरत है।

+0

धन्यवाद शेन - मैंने प्रश्न को और अधिक विशिष्ट बना दिया है जो मुझे – Greg

0

यदि कोई कोलन पाया जाता है तो यह कॉलन को पोर्ट नंबर के रूप में मानने वाले मान को पार्स करने का प्रयास करता है और यदि आप वैध पोर्ट नंबर प्रदान नहीं करते हैं तो यह असफल हो जाएगा। इसी तरह के मुद्दे और MSDN link for UriFormatException details के उदाहरण के लिए here देखें।

+0

धन्यवाद टैनर की मदद करेगा - मैंने प्रश्न को और अधिक विशिष्ट बना दिया है जो मुझे – Greg

संबंधित मुद्दे