Consider a Web.config
file containing the following httpHandlers
declaration:
<httpHandlers>
<add verb="*" path="*" type="MyWebApp.TotalHandlerFactory"/>
</httpHandlers>
In other words, this handler factory wants to “see” all incoming requests so that it gets a chance to handle them. However, it does not necessarily want to actually handle all of them, only those that fulfill a certain run-time condition:
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) { }
}
However, doing it like this completely overrides the default ASP.NET handler, which means that ASP.NET pages and web services no longer work. I just get a blank page for every URL that doesn’t fulfill the “some condition” in the “if”. Therefore, it seems that returning null
is the wrong thing to do.
So what do I need to return instead so that ASP.NET pages and web services are still handled normally?
It is not possible to do this in the general case.
I had the same problem, and seems that doing that is not possible using an HttpHandlerFactory.
But, I found a workaround that solved the problem: Using an HttpModule to filter which requests should go to my custom HttpHandler:
First, remove the any reference to your
HttpHandler
from the web.config.Then, add a reference to the following HttpModule inside the
<Modules>
section:Finally, assume at your HttpHandler that all the incoming request fulfill your criteria, and handle there all the requests.
I would have thought the easiest way would be for your class to inherit from
System.Web.UI.PageHandlerFactory
and then in an else clause just callbase.GetHandler()
.Without knowing all of your requirements, it sounds like a HttpModule is a more suitable solution for your problem.