Как получить ссылку на обработчик страниц ASP.NET по умолчанию или обработчик веб-служб?
Рассмотрим Web.config
файл, содержащий следующее httpHandlers
объявление:
<httpHandlers>
<add verb="*" path="*" type="MyWebApp.TotalHandlerFactory"/>
</httpHandlers>
Другими словами, эта фабрика обработчиков хочет "видеть" все входящие запросы, чтобы иметь возможность обрабатывать их. Тем не менее, он не обязательно хочет обрабатывать все из них, только те, которые удовлетворяют определенному условию времени выполнения:
public sealed class TotalHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
if (some condition is true)
return new MySpecialHttpHandler();
return null;
}
public void ReleaseHandler(IHttpHandler handler) { }
}
Тем не менее, выполнение этого полностью переопределяет стандартный обработчик ASP.NET, что означает, что страницы и веб-службы ASP.NET больше не работают. Я просто получаю пустую страницу для каждого URL, который не соответствует "некоторому условию" в "если". Поэтому кажется, что возвращение null
это не то, что нужно делать.
Итак, что мне нужно вернуть, чтобы страницы ASP.NET и веб-службы по-прежнему обрабатывались нормально?
4 ответа
Я бы подумал, что самый простой способ для вашего класса будет наследовать от System.Web.UI.PageHandlerFactory
а затем в другом предложении просто позвоните base.GetHandler()
,
public sealed class TotalHandlerFactory : System.Web.UI.PageHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
if (some condition is true)
return new MySpecialHttpHandler();
else
return base.GetHandler(context, requestType, url, pathTranslated)
}
}
У меня была та же проблема, и кажется, что это невозможно с помощью HttpHandlerFactory.
Но я нашел обходной путь, который решил проблему: использование HttpModule для фильтрации запросов, которые должны отправляться на мой пользовательский HttpHandler:
Во-первых, удалите любую ссылку на ваш HttpHandler
из web.config.
Затем добавьте ссылку на следующий HttpModule внутри <Modules>
раздел:
public class MyHttpModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication application)
{
application.PostAuthenticateRequest += new EventHandler(application_PostAuthenticateRequest);
}
void application_PostAuthenticateRequest(object sender, EventArgs e)
{
var app = sender as HttpApplication;
var requestUrl = context.Request.Url.AbsolutePath;
if (requestUrl "meets criteria")
{
app.Context.RemapHandler(new MyHttpHandler());
}
}
}
Наконец, предположите у вашего HttpHandler, что все входящие запросы соответствуют вашим критериям, и обработайте там все запросы.
Не зная всех ваших требований, похоже, что HttpModule - более подходящее решение для вашей проблемы.