2012-02-06 7 views
5

Рассмотрим Web.config файл, содержащий следующую httpHandlers декларацию:Как получить ссылку на обработчик страницы ASP.NET по умолчанию или обработчик веб-сервисов?

<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-адреса, который не выполняет «какое-то условие» в «if». Поэтому кажется, что возвращение null - это неправильная вещь.

Итак, что мне нужно для возврата, чтобы страницы ASP.NET и веб-службы по-прежнему обрабатывались нормально?

+0

Я понял, что это HttpHandlerFactory, а не сам обработчик. – Aliostad

ответ

0

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

2

Я бы подумал, что самый простой способ для вашего класса - наследовать от 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) 
    } 
} 
+1

Это работает для страниц, но не для веб-сервисов ... – Timwi

+0

Хм .. не уверен. Это был код, который я лежал, но он не нужен для веб-сервисов. Однако я не вижу другого простого способа создания базового обработчика. :( – Chris

0

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

2

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