2011-08-11 24 views
8

सबसे पहले, कुछ त्वरित पृष्ठभूमि ... किसी तीसरे पक्ष के विक्रेता के साथ एकीकरण के हिस्से के रूप में, मेरे पास एक सी # नेट वेब एप्लिकेशन है जो एक यूआरएल प्राप्त करता है जिसमें जानकारी का एक गुच्छा है क्वेरी स्ट्रिंग। उस यूआरएल को एमडी 5 हैश और एक साझा गुप्त कुंजी के साथ हस्ताक्षरित किया गया है। असल में, मैं क्वेरी स्ट्रिंग में खींचता हूं, अपने हैश को हटाता हूं, शेष क्वेरी स्ट्रिंग पर अपना खुद का हैश करता हूं, और सुनिश्चित करता हूं कि मेरा आपूर्ति किया गया था।नेट यूरी एन्कोडिंग आरएफसी 2396 बनाम आरएफसी 3 9 86

मैं निम्नलिखित तरीके से उरी पुन: प्राप्त करने हूँ ...

Uri uriFromVendor = new Uri(Request.Url.ToString()); 
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark 

मेरे मुद्दा क्वेरी स्ट्रिंग यूमलॉट (यू) की तरह विशेष वर्ण से उत्पन्न कर रहा है। विक्रेता आरएफसी 23 9 6 प्रतिनिधित्व के आधार पर उनके हैश की गणना कर रहा है जो %FC है। मेरा सी # नेट ऐप आरएफसी 3986 प्रतिनिधित्व के आधार पर हैश की गणना कर रहा है जो %C3%BC है। कहने की जरूरत नहीं है, हमारे हैंश मेल नहीं खाते हैं, और मैंने अपनी त्रुटियों को फेंक दिया।

आश्चर्यजनक रूप से, documentation for the Uri class in .Net कहता है कि इसे आरएफसी 23 9 6 का पालन करना चाहिए जब तक कि अन्यथा आरएफसी 3986 पर सेट न हो, लेकिन मेरे पास web.config फ़ाइल में प्रवेश नहीं है जो वे कहते हैं कि इस व्यवहार के लिए आवश्यक है।

मैं आरएफसी 23 9 6 सम्मेलन का उपयोग करने के लिए उरी कन्स्ट्रक्टर को कैसे मजबूर कर सकता हूं?

यह विफल हो रहा है, आरएफसी 3986 ऑक्टेट जोड़े को आरएफसी 2396 ऑक्टेट्स में परिवर्तित करने का कोई आसान तरीका है?

+1

अपने प्रश्न के साथ कुछ भी करने के लिए नहीं, लेकिन आप यहां एक नया उरी क्यों बना रहे हैं? आप बस 'स्ट्रिंग क्वेरीफ्रॉन्डर = Request.Url.Query.Substring (1) कर सकते हैं; ' – magnattic

+0

.NET का कौन सा संस्करण आप उपयोग कर रहे हैं? –

+0

मैं .NET 4.0 का उपयोग कर रहा हूं। इसके अलावा, उत्सुकता से, जब मैंने 'Request.Url.Query' का उपयोग करने का प्रयास किया तो उमलॉट'% ufffd' के रूप में आ रहा था जो चरित्र है। – Colin

उत्तर

2

कुछ भी नहीं है, लेकिन क्यों आप एक नया उरी यहाँ बना रहे हैं? आप बस string queryFromVendor = Request.Url.Query.Substring(1) कर सकते हैं; - atticae

एटिका के लिए +1! मैं अपरिवर्तनीय उरी को हटाने और कोशिश करने के लिए वापस गया, अचानक स्ट्रिंग में UTF-16 के बजाय यूटीएफ -8 के रूप में एन्कोड किया गया था।

पहले, मुझे नहीं लगता था कि यह काम करेगा। लाइन के साथ कहीं, मैंने Request.QueryString का उपयोग करके यूआरएल पुनर्प्राप्त करने का प्रयास किया था, लेकिन यह umlaut को %ufffd के माध्यम से आने वाला था जो चरित्र है। एक नया परिप्रेक्ष्य लेने के हित में, मैंने एटिका के सुझाव की कोशिश की और यह काम किया।

मुझे पूरा यकीन है कि उत्तर something I read here के साथ करना है।

सी # अपने सभी स्ट्रिंग्स में UTF-16 का उपयोग करता है एन्कोड करने के लिए जब यह नदियों और फ़ाइलों पर हमें लाने कि के साथ काम करने के लिए आता उपकरणों के साथ, ...

ASP.NET डिफ़ॉल्ट रूप से UTF-8 का उपयोग करता है, और यह एक समय के बारे में सोचना है जब यह एक अच्छा विकल्प नहीं है मुश्किल है ...

मेरे समस्याओं यहाँ से उपजी ...

Uri uriFromVendor = new Uri(Request.Url.ToString()); 

Request.Url uri लेने से और एक और यूरी बनाने, यह सी # मानक यूटीएफ -16 के रूप में एन्कोडिंग था। मूल यूरी का उपयोग करके, यह नेट मानक यूटीएफ -8 में बना रहा।

आपकी मदद के लिए सभी को धन्यवाद।

+0

खुशी है कि मैं मदद कर सकता हूं। – magnattic

1

मैं अगर यह एक रेड हेरिंग का एक सा है सोच रहा हूँ:

मैं यह कहना है क्योंकि एफसी उमलाउट यू के UTF16 जाता है; सी 2 बीसी यूटीएफ 8 प्रतिनिधित्व है।

मुझे आश्चर्य है कि सिस्टम डेटा में से एक है। स्रोत डेटा को सामान्य डेटा में परिवर्तित करने के लिए। नेट स्ट्रिंग मदद कर सकती है।

यह सवाल ब्याज की भी हो सकती है: Encode and Decode rfc2396 URLs

1

मैं उरी निर्माताओं के लिए मानक एन्कोडिंग के बारे में पता नहीं है, लेकिन अगर सब कुछ विफल रहता है तो आप हमेशा अपने आप को यूआरएल को डिकोड और जो कुछ भी आप की तरह एन्कोडिंग में यह सांकेतिक शब्दों में बदलना कर सकता है ।

HttpUtility-Class में UrlDecode() और UrlEncode() विधि है, जो आपको System.Text.Encoding को दूसरे पैरामीटर के रूप में निर्दिष्ट करने देता है।

उदाहरण के लिए: अपने प्रश्न के साथ क्या करना

string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1)); 
string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16")); 
// calc hash here 
+0

ऐसा लगता है कि UrlEncode विधि थोड़ा अति उत्साही हो जाता है। आउटपुट ने स्ट्रिंग में सबकुछ एन्कोड किया है ... सी% 00o% 00 एन% 00 एफ% 00i% 00r% 00 एम% 00 ए% 00t% 00i% 00o% 00 ... – Colin

+0

नोट: यह उमलॉट को वापस परिवर्तित करने का प्रबंधन करता था हालांकि '% एफसी'। क्या थोड़ा अधिक चुनिंदा होने का कोई तरीका है, इसलिए यह एम्पर्सेंड, प्लस और% 00 के एन्कोड नहीं करता है? – Colin

+0

ठीक है, सबसे पहले:% 00 परिणाम utf-16 एन्कोडिंग का परिणाम है, जिसे मैंने अभी यहां एक उदाहरण के रूप में उपयोग किया है। जो भी एन्कोडिंग आप चाहते हैं उसे बदलें। यदि आप ü को% FC में परिवर्तित करना चाहते हैं, तो हो सकता है कि आप लैटिन 1: 'System.Text.Encoding.GetEncoding ("latin1") ' – magnattic

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