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 неприменима. Однако есть несколько вещей, которые я мог бы предложить:
Если вы управляете реализацией обработчика, который возвращает 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 } } }
Можно использовать описанный выше подход и просто указать фактический HttpContext в вашей реализации обработчика. Я думаю, что это может привести к странным архитектурным местам, но это ваш вызов.