2008-10-27 12 views
33

का उपयोग किये बिना यूआरएल से बच निकला है क्या कोई ऐसा कार्य है जो बच निकलने वाली यूआरएल स्ट्रिंग को अपने अनचाहे रूप में परिवर्तित करता है? System.Web.HttpUtility.UrlDecode() वह काम कर सकता है लेकिन मैं System.Web.dll पर कोई संदर्भ जोड़ना नहीं चाहता हूं। चूंकि मेरा ऐप वेब एप्लिकेशन नहीं है, इसलिए मैं केवल एक असेंबली में फ़ंक्शन का उपयोग करने के लिए निर्भरता जोड़ना नहीं चाहता हूं।डीकोड HttpUtility.UrlDecode

अद्यतन: उसी समस्या के बारे में Rick Strahl's blog post देखें।

+1

रिक स्ट्राल की पोस्ट को पढ़ना आवश्यक है - इसमें आवश्यक पृष्ठभूमि और .NET फ्रेमवर्क ऑफ़र (या ऑफ़र नहीं) के विभिन्न समाधानों के गहराई से विश्लेषण शामिल है। – Oliver

+0

संभावित डुप्लिकेट [मैं सी # का उपयोग कर यूआरएल पैरामीटर कैसे डीकोड कर सकता हूं?] (Http://stackoverflow.com/questions/1405048/how-do-i-decode-a-url-parameter-using-c) –

उत्तर

58

संपादित करें: स्थिर विधि का प्रयोग करें Uri.UnescapeDataString() अपने यूआरएल को डिकोड करने के:

एन्कोडेड:http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

डीकोड:http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

+0

यह मेरे लिए काम करने के लिए तैयार नहीं है, यह सिर्फ मूल स्ट्रिंग पास 'Uri.UnescapeDataString (myurl)' – Smith

+6

पर लौटाता है सावधान रहें: यह प्लस संकेतों के लिए काम नहीं करता है - http://blogs.msdn.com/b/ yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx मैं अभी भी एक बेहतर विधि की तलाश में हूं। –

+2

@ क्रिस: रिक स्ट्राल ने 'Uri.UnescapeDataString() 'के आसपास एक उपयोगिता वर्ग बनाया जो' + 'सही ढंग से संकेतों को संभालता है। अधिक जानकारी के लिए [उसका ब्लॉग पोस्ट] देखें (http://www.west-wind.com/weblog/posts/617930.aspx)। – Oliver

0

माइक्रोसॉफ्ट एसीई टीम में Anti-XSS library में डीकोड का एक विस्तारित (और बेहतर) संस्करण है। हालांकि मुझे यकीन नहीं है कि यह सिर्फ गुजरता है या नहीं।

(मैं नहीं दिख रहा है तुम क्यों कर रहे हैं कि ईमानदार होना System.web.dll पर निर्भरता के बारे में चिंतित)

+0

कारण यह है कि मैं केवल एक विधि कॉल के लिए मेरी मेमोरी स्पेस में एक बड़ा डीएलएल लोड नहीं करना चाहता हूं। यह अच्छा होगा अगर कोई कार्यान्वयन इंगित करता है (शायद रेगेक्स का उपयोग करता है) जिसे मैं अपनी परियोजना में कॉपी/पेस्ट कर सकता हूं। – huseyint

+0

एक रेगेक्स समाधान पर्याप्त नहीं होगा; डिकोडिंग * हार्ड * है। यदि आप वास्तव में चिंतित हैं, तो * खांसी *, परावर्तक। क्या आपने वास्तव में असेंबली लोड करने की स्मृति लागत को देखा है? यह शायद उतना बड़ा नहीं है जितना आप सोचते हैं। – blowdart

+1

ध्यान दें कि अलग-अलग ढांचे के संस्करण (esp। "क्लाइंट प्रोफाइल") इससे बचने के लिए एक वैध कारण हैं - लेकिन इसके बारे में * बहुत * उत्साहित होने के लायक नहीं हैं; -पी –

0

आप पहले से ही नेट ढांचे पर एक विशाल निर्भरता है, CLR etal। तो, वास्तव में, आपके पास System.Web.DLL पर पहले से ही अप्रत्यक्ष निर्भरता है; आपका आवेदन स्थानीय मशीन पर इसकी उपस्थिति के बिना नहीं चल सकता है।

और आप स्मृति के बारे में चिंतित हैं? क्या आपके पास स्मृति समस्याएं हैं? यदि आपके पास स्मृति समस्याएं इतनी चरम हैं कि आप अपने ऐप की मेमोरी में डीएलएल के कुछ केबी लोड नहीं कर सकते हैं, तो आप .NET क्यों कोड कर रहे हैं? या आप अभी समय से अनुकूलन कर रहे हैं?

तो इसके बारे में चिंता न करें।

+5

आपका दावा गलत है; "क्लाइंट प्रोफाइल", "सीएफ" और "सिल्वरलाइट" में सिस्टम.Web.dll की कमी होगी; "क्लाइंट प्रोफाइल" नियमित .NET का एक संस्करण है, इसलिए सबसे अधिक आकर्षक है। –

+1

@marc iirc जब इसका उत्तर दिया गया था तो क्लाइंट प्रोफाइल जारी नहीं किए गए थे/आमतौर पर इसके बारे में ज्ञात नहीं थे। दूसरा, वह यह नहीं कहता कि किस प्रकार का ऐप है, और वास्तव में जिस तरह से वह सवाल पूछता है कि यह system.web.dll को संदर्भित करने का विकल्प है। अन्यथा सवाल मंथन है। तो मेरा जोर सबसे अधिक सही है। Nyah। – Will

4

सिस्टम.Web.dll को लोड नहीं करना - जैसा कि अन्य ने ध्यान दिया है, तब तक उत्साहित होने के लायक नहीं है जब तक आपको पता न हो कि आपको उन ग्राहकों से निपटने की आवश्यकता है, जिनके पास यह नहीं हो सकता है ("क्लाइंट प्रोफाइल", "कॉम्पैक्ट फ्रेमवर्क" , "माइक्रो फ्रेमवर्क", "चांदी की रोशनी")।

पुन: स्थान; यह वास्तव में बहुत कुछ नहीं होगा; ध्यान दें कि .NET असेंबली विधि-दर-विधि आधार पर JITted हैं, इसलिए कुछ विधियों का उपयोग करने से कोई महत्वपूर्ण ओवरहेड नहीं होगा।

वास्तविक समस्या (आईएमओ) आपके आत्मविश्वास का स्तर है कि ग्राहक के पास System.Web.dll है; अगर आप खुश हैं कि वे पूर्ण ढांचे का उपयोग कर रहे हैं, तो बस इसके लिए जाएं।

+0

System.Web.dll * बहुत * भारी है, * ध्यान देने योग्य * स्टार्टअप प्रभाव के साथ। –

+0

@ कॉम्प्यूटर भाषाविद रोल vNext पर, आह? –

+0

क्या 7 साल में और कुछ नहीं आया है? मेरा मतलब है, इसे vNext के लिए जाना होगा। –

0


@Smith मैं हो रही थी समस्या बचाओ कोई बदलाव नहीं या सिर्फ आगे जुआ।

कई चीजों का परीक्षण करने के बाद मैंने देखा कि एक परीक्षण स्ट्रिंग डीकोड किया गया था। आखिरकार मुझे एक नई खाली स्ट्रिंग बनाना पड़ा, एन्कोडेड स्ट्रिंग के लिए इसका मान सेट करें, फिर नई स्ट्रिंग पर WebUtility.HtmlDecode और Uri.UnescapeDataString चलाएं। किसी कारण से मुझे उल्लेख किए गए क्रम में डीकोड और अनदेस्केप चलाया गया था। विचित्र।

मैंने इसे इस तरह से हल किया।

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d" 

Dim strDecoded as string = "" 
strDecoded = strEncoded 
strDecoded = WebUtility.HtmlDecode(strDecoded) 
strDecoded = Uri.UnescapeDataString(strDecoded) 
-2

System.Net.WebUtility.HtmlDecode भी .NET 4.0 ग्राहकों का प्रोफाइल पर काम कर रहा है।

+2

यूआरएल एंडकोडिंग/डिकोडिंग! = एचटीएमएल एन्कोडिंग/डिकोडिंग। –

5

यदि आप .NET 4 का उपयोग कर रहे हैं।0 या बाद में, आप WebUtility.UrlDecode का उपयोग कर सकते हैं जो क्लाइंट प्रोफाइल के साथ काम करता है और प्लस संकेतों को सही तरीके से संसाधित करता है (this चर्चा देखें)।

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