问题
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?
回答1:
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)
}
}
回答2:
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.
回答3:
Without knowing all of your requirements, it sounds like a HttpModule is a more suitable solution for your problem.
回答4:
It is not possible to do this in the general case.
来源:https://stackoverflow.com/questions/9162632/how-to-obtain-a-reference-to-the-default-asp-net-page-handler-or-web-services-ha