0
public class HandlerFactory : IHttpHandlerFactory
{
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
    {
        // lots of code
    }

    public void ReleaseHandler(IHttpHandler handler)
    {
        // HttpContext.Current is always null here.
    }
}

HttpContext.Current を利用できるようにするにはどうすればよいですか (または、ReleaseHandler で取得できるようにリクエストごとの変数を保存する別の方法を使用します)。

4

1 に答える 1

0

.NET Reflector の System.Web アセンブリを見ると、ReleaseHandler が要求のライフサイクル外で呼び出される可能性があるように見えます。これは、HttpContext.Current を持つという概念が適用されないことを意味します。ただし、私が提案できることがいくつかあります。

  1. GetHandler が返すハンドラーの実装を制御する場合、公開メンバーまたは内部メンバーを追加して、ReleaseHandler で使用する特定のデータを表すことができます。

    public class MyHandler : IHttpHandler
    {
        /* Normal IHttpHandler implementation */
    
        public string ThingIWantToUseLater { get;set; }
    }
    

    次に、ハンドラー ファクトリで次のようにします。

    public class HandlerFactory : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            // lots of code
            return new MyHandler()
            {
                    ThingIWantToUseLater = "some value"
            };
        }
    
        public void ReleaseHandler(IHttpHandler handler)
        {
             if (handler is MyHandler)
             {
                  var myHandler = handler as MyHandler;
                  // do things with myHandler.ThingIWantToUseLater
             }
        }
    }
    
  2. 上記のアプローチを使用して、ハンドラーの実装に実際の HttpContext を差し込むだけです。それは奇妙な建築物の場所につながる可能性があると思いますが、それはあなたの呼びかけです.

于 2014-02-01T02:06:06.343 に答える