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 回答