5

考虑一个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 服务?

4

4 回答 4

2

我原以为最简单的方法是让你的类继承System.Web.UI.PageHandlerFactory,然后在 else 子句中调用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)
    }
}
于 2012-02-06T15:52:18.480 回答
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 中假设所有传入请求都满足您的条件,并在那里处理所有请求。

于 2014-04-10T06:42:48.107 回答
0

在不了解您的所有要求的情况下,听起来 HttpModule 是更适合您的问题的解决方案。

于 2012-02-06T15:56:37.337 回答
0

在一般情况下是不可能做到这一点的。

于 2012-02-10T17:41:51.507 回答