2011-06-08 14 views
5

http://ayende.com/blog/4599/hunt-the-bug के अनुसार, मैंने उन परिदृश्यों में से एक में भाग लिया है जिससे "इस संदर्भ में प्रतिक्रिया उपलब्ध नहीं है"।HttpUtility.UrlEncode और Application_Start

बहुत सरल है, तो निम्न Windows सर्वर पर कुछ निश्चित परिस्थितियों में एक अपवाद फेंकता 2008/IIS7/ASP.NET 4,0

public class Global : HttpApplication 
{ 
     public void Application_Start(object sender, EventArgs e) 
     { 
      HttpUtility.UrlEncode("Error inside!"); 
     } 
}  

समाधान है कि मैंने देखा है शामिल निम्न में से एक:

  1. जैसा कि अयेंडे ने किया था और "इस बग से बचने के लिए अपनी खुद की हताशता लिखें (अच्छी तरह से, मोनो से इसे ले जाएं और इसे संशोधित करें)।"
  2. या यह निर्धारित करें कि HttpEncoder.Default का उपयोग करना चाल है। मैं यह ट्रैक करने की कोशिश कर रहा हूं कि यह कैसे करना है।
  3. या प्रति Server.UrlEncode vs. HttpUtility.UrlEncode

शायद यह मेरे सबसे अच्छे Googling दिन है, लेकिन कैसे HttpEncoder.Default लागू करने के लिए नहीं कर रहा है के रूप में Uri.EscapeDataString का उपयोग करें?

सिफारिशें?

उत्तर

3

आप

public static string UrlEncode(string s) 
{ 
    return typeof(System.Net.WebClient).InvokeMember("UrlEncode", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new[] { "[#encoded] <data>" }) as string; 
} 

// by @DmitryDzygin 
public static string UrlDecode(string s) 
{ 
    return typeof(System.Net.WebClient).Assembly.GetType("System.Net.HttpListenerRequest+Helpers").InvokeMember("UrlDecodeStringFromStringInternal", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new object[] { s, Encoding.UTF8 }) as string; 
} 

एन्कोड करने के लिए इस कोशिश कर सकते हैं और अगर आप या आपके आवेदन पूर्ण विश्वास स्तर में नहीं चल रहा है के साथ सहज महसूस नहीं करते हैं, कोशिश इस

public class HttpUtils : System.Web.Util.HttpEncoder 
{ 
    private static HttpUtils _encoder; 
    internal static HttpUtils Encoder 
    { 
     get { return _encoder ?? (_encoder = new HttpUtils()); } 
    } 

    internal string InternalUrlEncode(string s) 
    { 
     var bytes = System.Text.Encoding.UTF8.GetBytes(s); 
     var encodedBytes = base.UrlEncode(bytes, 0, bytes.Length); 

     return System.Text.Encoding.UTF8.GetString(encodedBytes); 
    } 

    public static string UrlEncode(string s) 
    { 
     return Encoder.InternalUrlEncode(s); 
    } 
} 

मैं जानता हूँ यह है अभी भी सबसे अच्छा तरीका नहीं है, लेकिन अगर हम HttpUtility.UrlEncode का उपयोग नहीं करते हैं तो सबसे अच्छा तरीका क्या हो सकता है!

+1

अच्छी नौकरी। यहाँ प्रतिबिंब/डिकोडर हिस्सा सार्वजनिक स्थैतिक स्ट्रिंग UrlDecode है (स्ट्रिंग urlPart) { वापसी typeof (System.Net.WebClient) .Assembly .GetType ("System.Net.HttpListenerRequest + सहायकों") .InvokeMember ("UrlDecodeStringFromStringInternal", बाइंडिंगफ्लैग्स.NonPublic | बाइंडिंगफ्लैग्स.स्टैटिक | बाइंडिंगफ्लैग्स.इनवोक मोड, शून्य, शून्य, नई ऑब्जेक्ट [] {urlPart, Encoding.UTF8}) स्ट्रिंग के रूप में; } –

+0

@DmitryDzygin डिकोडर – Beygi

+1

प्रतिक्रिया के लिए धन्यवाद। इसे उत्तर के रूप में चिह्नित किया है, भले ही मैं सिर्फ मोनो संस्करण को अनुकूलित करने जा रहा हूं (https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility देखें .cs) बस इसलिए कि मैं System.Web पर निर्भरता से भी दूर हो सकता हूं जो केवल HttpUtility.UrlEncode के कारण है। – Ted

3

पूर्ण ट्रस्ट की आवश्यकता

public static class DefaultHttpEncoder 
{ 
    public static string UrlEncode(string urlPart) 
    { 
     using (new NoHttpContext()) 
     { 
      return HttpUtility.UrlEncode(urlPart); 
     } 
    } 

    public static string UrlDecode(string urlPart) 
    { 
     using (new NoHttpContext()) 
     { 
      return HttpUtility.UrlDecode(urlPart); 
     } 
    } 

    private class NoHttpContext : IDisposable 
    { 
     private readonly HttpContext _context; 

     public NoHttpContext() 
     { 
      _context = HttpContext.Current; 
      HttpContext.Current = null; 
     } 

     public void Dispose() 
     { 
      HttpContext.Current = _context; 
     } 
    } 
} 
+0

ठीक है! ..., लेकिन उन लोगों के लिए जो यह सोच सकते हैं कि यह मुश्किल है, ऐसा नहीं है क्योंकि .NET HttpContext.Current को अनुरोध छोड़ रहा है, अगर यह शून्य है, और जब बिल्कुल नहीं है तो यह बग स्वयं को दिखा रहा है। – Beygi

+0

प्रतिक्रिया के लिए धन्यवाद। अच्छा समाधान है कि मैं भविष्य के लिए ध्यान में रखूंगा! हालांकि, हालांकि दुर्भाग्य से मैं अपने प्रश्न में इसका जिक्र नहीं करता हूं, पूर्ण विश्वास एक विकल्प नहीं है। – Ted

+0

अच्छा समाधान। मेरे लिए अच्छा काम किया। –

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