Как получить ссылку на обработчик страниц ASP.NET по умолчанию или обработчик веб-служб? - PullRequest
5 голосов
/ 06 февраля 2012

Рассмотрим файл 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 ]

2 голосов
/ 10 апреля 2014

У меня была такая же проблема, и кажется, что сделать это невозможно с помощью 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, что все входящие запросы соответствуют вашим критериям, и обработайте там все запросы.

2 голосов
/ 06 февраля 2012

Я бы подумал, что самый простой способ - это чтобы ваш класс наследовал от System.Web.UI.PageHandlerFactory, а затем в предложении else просто вызовите 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)
    }
}
0 голосов
/ 10 февраля 2012

Невозможно сделать это в общем случае.

0 голосов
/ 06 февраля 2012

Не зная всех ваших требований, похоже, что HttpModule - более подходящее решение для вашей проблемы.

...