简体   繁体   English

HttpUtility.UrlEncode 和 Application_Start

[英]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".根据http://ayende.com/blog/4599/hunt-the-bug ,我遇到了“响应在此上下文中不可用”的场景之一。

Greatly simplified, the following throws an exception in certain scenarios on Windows Server 2008/IIS7/ASP.NET 4.0大大简化了,下面在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."像 Ayende 所做的那样,“编写我自己的 HttpUtility(好吧,从 Mono 中获取并修改它)来避免这个错误。”
  2. or determine whether using HttpEncoder.Default instead does the trick.或确定是否使用 HttpEncoder.Default 来代替。 I'm trying to track down how best to do this.我正在尝试找出最好的方法。
  3. or use Uri.EscapeDataString as per Server.UrlEncode vs. HttpUtility.UrlEncode或根据Server.UrlEncode 与 HttpUtility.UrlEncode 使用 Uri.EscapeDataString

Maybe it's not my best googling day, but how to implement HttpEncoder.Default?也许这不是我最好的谷歌搜索日,但是如何实现 HttpEncoder.Default?

Recommendations?建议?

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...我知道这仍然不是最好的方法,但如果我们不使用 HttpUtility.UrlEncode 最好的方法是什么......

Requires FULL trust需要完全信任

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM