2012-11-26 31 views
19

मैं किसी रिश्तेदार यूआरआई से क्वेरी स्ट्रिंग और खंड को निकालना चाहता हूं, यानी, किसी भी योजना या मेजबान जानकारी के बिना यूआरआई।पार्स रिश्तेदार यूआरआई

क्या नकली होस्ट नाम के साथ इसे पूर्ण यूआरआई में बदलकर ऐसा करने का एक और शानदार तरीका है?

var relativeUri = "/dir1/dir2/file?a=b&c=d#fragment"; 
var uri = new Uri(new Uri("http://example.com"), relativeUri); 
var path = Uri.UnescapeDataString(String.Concat(uri.Segments)); 
var query = uri.Query; 
var fragment = uri.Fragment; 
// path = "/dir1/dir2/file", query = "?a=b&c=d", fragment = "#fragment" 

उत्तर

12

हालांकि आप एक मेजबान भाग के बिना एक Uri बना सकते हैं, उसके गुण का सबसे तो एक InvalidOperationException फेंक देते हैं ( "यह कार्रवाई एक सापेक्ष URI के लिए समर्थित नहीं है"), क्योंकि उन गुणों एक निरपेक्ष उरी पर भरोसा करते हैं ।

HttpUtility.ParseQueryString() वास्तव में यहां सहायता नहीं करेगा, क्योंकि यह केवल उरी के प्रश्न भाग पर काम करता है, जिसे आप प्राप्त नहीं कर सकते क्योंकि आपके पास पूर्ण उरी नहीं है।

तो हालांकि यह हैकी लग सकता है, मुझे लगता है कि new Uri(baseUri, relativeUri) contstructor वही करता है जो आप चाहते हैं। मुझे इसे पूरा करने के लिए एक बेहतर या क्लीनर तरीका नहीं दिख रहा है।

+0

वास्तव में, 'HttpUtility.ParseQueryString()' सापेक्ष URL के साथ के रूप में अच्छी तरह से काम । पार्टी के लिए थोड़ा देर हो चुकी थी - लेकिन कुछ इसी तरह की जांच कर रही थी :) – NomadTraveler

+1

@ नोमाड मुझे डर है कि यह नहीं है। 'HttpUtility.ParseQueryString ("/ dir1/dir2/file? A = b और c = d # खंड");' दो परिणाम उत्पन्न करता है: '/ dir1/dir2/file? A = b' और' c = d # fragment', जो बिल्कुल वही नहीं है जिसमें आप रुचि रखते हैं। आपको वास्तव में केवल एक क्वेरी स्ट्रिंग पास करने की आवश्यकता है। – CodeCaster

0

इस समस्या में खुद को चलाने में मैंने पाया कि HttpUtility.ParseQueryString वास्तव में केवल एक स्ट्रिंग और '?' के बाद कुछ भी ढूंढ रहा है

इसलिए किया जा रहा है मैं (सापेक्ष और निरपेक्ष) मैं निम्नलिखित मिल काफी अच्छी तरह से काम करने लगता है दोनों ही मामलों में इस का उपयोग करने के लिए है कि

HttpUtility.ParseQueryString(a.Attributes["href"].Value.Split('?').Last())