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?
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 call 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)
}
}
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:
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());
}
}
}
Finally, assume at your HttpHandler that all the incoming request fulfill your criteria, and handle there all the requests.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With