5

http://ayende.com/blog/4599/hunt-the-bugによると、「このコンテキストでは応答が利用できない」というシナリオの1つに遭遇しました。

非常に単純化された次の例では、Windows Server 2008 / IIS7 /ASP.NET4.0の特定のシナリオで例外がスローされます。

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

私が見た解決策には、次のいずれかが含まれます。

  1. Ayendeが行ったように実行し、「このバグを回避するために、独自のHttpUtilityを作成します(Monoから1つを取得して変更します)。」
  2. または、代わりにHttpEncoder.Defaultを使用するかどうかを判断します。私はこれを行うための最善の方法を追跡しようとしています。
  3. または、Server.UrlEncodeとHttpUtility.UrlEncodeのようにUri.EscapeDataStringを使用します

多分それは私の最高のグーグルの日ではありませんが、HttpEncoder.Defaultを実装する方法は?

推奨事項?

4

2 に答える 2

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!..を使用しない場合の最善の方法は何でしょうか。

于 2011-06-23T19:31:27.083 に答える
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;
        }
    }
}
于 2011-06-24T09:47:31.163 に答える