HttpContext.Current является нулевым в пользовательском IHttpHandlerFactory

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)?

1 ответ

После просмотра сборки System.Web в.NET Reflector выясняется, что 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 в вашей реализации обработчика. Я думаю, что это может привести к странным архитектурным местам, но это ваш вызов.

Другие вопросы по тегам