2013-04-02 11 views
5

मेरे पास एक यूआरएल है: http://localhost:8080/search.json?q=L%u00e6r, जो लेयर के लिए एन्कोडेड खोज है।WebRequest.Create अनुचित रूप से डीकोड यूआरएल

दुर्भाग्यवश WebRequest.Create(url) का उपयोग करके इस यूआरएल से वेबरक्वेट बनाना निम्नलिखित यूआरएल: http://localhost:8080/search.json?q=L%25u00e6r उत्पन्न करता है।

ध्यान दें कि यह गलत तरीके से %u00e6 डीकोड करता है, और %25u00e6r उत्पन्न करता है। क्या इस तरह के यूनिकोड से बचने वाले मूल्य को परिवर्तित करने या WebRequest प्राप्त करने का कोई तरीका है। इसे सही ढंग से संभालने के लिए तैयार करें?

यह सबसे अधिक संभावना है कि नेट टीम के लिए एक बग के रूप में रिपोर्ट की जानी चाहिए। WebRequest.Create() क्वेरी में §, æ, ø या å (या कोई अन्य गैर-असीसी वर्ण) होने पर Request.QueryString.ToString() द्वारा क्वेरी क्वेरी स्ट्रिंग का उपयोग नहीं कर सकता है। यहां एक छोटी सी एमवीसी कार्रवाई है जिसका परीक्षण करने के लिए इसका उपयोग किया जा सकता है। क्वेरी Query?q=L%C3A6r

public ActionResult Query() 
{ 
    var query = Request.QueryString.ToString(); 
    var url = "http://localhost:8080?" + query; 


    var request = WebRequest.Create(url); 
    using (var response = request.GetResponse()) 
    using (var stream = response.GetResponseStream()) 
    { 
     return new FileStreamResult(stream, "text/plain"); 
    } 
} 

संपादित से कॉल करने की:

दुर्भाग्य @ animaonline के समाधान http://localhost:8080/search.json?q=Lek+%26+L%u00e6r तरह यूआरएल, जो http://localhost:8080/search.json?q=Lek & Lær, जहां WebRequest.Create& के बारे में उलझन में हो जाता है में डीकोड कर रहे हैं के साथ काम नहीं करता है, और यह सोचता है पैरामीटर q का हिस्सा होने के बजाय पैरामीटर को अलग करता है।

+0

यदि आप इसे एन्कोडिंग के बिना पास करते हैं, तो निश्चित रूप से यह आपके लिए एन्कोडिंग करेगा? – Base33

+0

मैंने यूआरएल नहीं बनाया, यह किसी तीसरे पक्ष द्वारा आवेदन को दिया गया था। अब मुझे एक ही तीसरे पक्ष के खिलाफ यूआरएल का उपयोग करने की जरूरत है। यह ब्राउज़र में काम करता है, लेकिन सी # – Marius

+0

में नहीं ठीक है ठीक है! @ Anomeaonline के समाधान का प्रयास करें, यह मेरे लिए बहुत अच्छा लगता है! – Base33

उत्तर

3

समाधान यह सब शामिल होने से पहले, प्रत्येक अलग घटक में क्वेरी स्ट्रिंग विभाजित करने के लिए, इसे डीकोड और फिर UTF-8 के रूप में यह reencoding हो रहा है फिर एकसाथ।

string FixQuery(string query){ 
    return String.Join("&", 
    query.Split(new[] {'&'}) 
     .Select(
     p => 
      String.Join("=", 
      p.Split(new[] {'='}) 
       .Select(
       q => 
        HttpUtility.UrlEncode(
        HttpUtility.UrlDecode(q), 
        Encoding.UTF8 
       ) 
      ) 
     ) 
    ) 
); 
} 

//example usage 

var url = "http://localhost:8080/search?"+FixQuery(query); 
+0

, यह समाधान काम करता है लेकिन आपको दूसरे स्ट्रिंग को प्रत्येक स्ट्रिंग में लपेटना होगा। माता-पिता में जुड़ें और टॉअरे() पूरी चीज। – Dan

5

आप बनाएं निष्पादित करने से पहले अपने URL को डिकोड करने के लिए है

 var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r"); 

     var req = WebRequest.Create(decodedUrl); 
+0

मैंने प्रश्न को अद्यतन करने के लिए अद्यतन किया है कि दुर्भाग्यवश, यह विधि – Marius

+1

पर काम नहीं करती है, तो शायद आपको केवल तर्क को एन्कोड करना चाहिए? -> क्यू? .NET 3.5 का उपयोग करने वाले लोगों के लिए – animaonline

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