Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpUtility.UrlEncode and Application_Start

As per http://ayende.com/blog/4599/hunt-the-bug, I've run into one of those scenarios whereby "Response is not available in this context".

Greatly simplified, the following throws an exception in certain scenarios on Windows Server 2008/IIS7/ASP.NET 4.0

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

The solutions that I've seen involve one of the following:

  1. Do as Ayende did and "write my own HttpUtility (well, take the one from Mono and modify it) to avoid this bug."
  2. or determine whether using HttpEncoder.Default instead does the trick. I'm trying to track down how best to do this.
  3. or use Uri.EscapeDataString as per Server.UrlEncode vs. HttpUtility.UrlEncode

Maybe it's not my best googling day, but how to implement HttpEncoder.Default?

Recommendations?

like image 911
Ted Avatar asked Jun 08 '11 19:06

Ted


People also ask

What is the use of HttpUtility UrlEncode?

The UrlEncode method can be used to encode the entire URL, including query-string values. If characters such as blanks and punctuation are passed in an HTTP stream, they might be misinterpreted at the receiving end.

What is HttpUtility system?

HtmlEncode Method (System. Web) Converts a string into an HTML-encoded string. To encode or decode values outside of a web application, use the WebUtility class.

What is Server UrlEncode in asp net?

UrlEncode is a convenient way to access the HttpUtility. UrlEncode method at run time from an ASP.NET application. Internally, UrlEncode uses HttpUtility. UrlEncode to encode strings. To encode or decode values outside of a web application, use the WebUtility class.


1 Answers

You can try this for encoding

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;
}

And if you don't feel comfortable with or your application is not running in FULL trust level, try this

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);
    }
}

I Know it is not still the best way but what could the best way be if we don't use HttpUtility.UrlEncode!..

like image 124
Beygi Avatar answered Nov 03 '22 01:11

Beygi