考虑包含以下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页面和Web服务不再起作用。我只是为每个不符合“if”中的“某些条件”的URL获取空白页面。因此,似乎返回null
是错误的。
那么我需要返回什么才能正常处理ASP.NET页面和Web服务?
答案 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 :(得分:2)
我遇到了同样的问题,似乎使用HttpHandlerFactory无法做到这一点。
但是,我找到了解决问题的解决方法:使用HttpModule过滤哪些请求应该转到我的自定义HttpHandler:
首先,从web.config中删除对HttpHandler
的任何引用。
然后,在<Modules>
部分中添加对以下HttpModule的引用:
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 :(得分:0)
在不了解您的所有要求的情况下,听起来HttpModule是更适合您问题的解决方案。
答案 3 :(得分:0)
在一般情况下不可能这样做。