【问题标题】:How to obtain a reference to the default ASP.NET page handler or web-services handler?如何获取对默认 ASP.NET 页面处理程序或 Web 服务处理程序的引用?
【发布时间】:2012-02-06 15:38:13
【问题描述】:

考虑一个包含以下httpHandlers 声明的Web.config 文件:

<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 服务?

【问题讨论】:

  • 我意识到它是 HttpHandlerFactory 而不是处理程序本身。

标签: asp.net ihttphandler httphandlerfactory


【解决方案1】:

我原以为最简单的方法是让您的类从 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)
    }
}

【讨论】:

  • 嗯.. 不确定。那是我一直在使用的代码,但 Web 服务不需要它。不过,我看不到任何其他创建基本处理程序的简单方法。 :(
【解决方案2】:

我遇到了同样的问题,而且似乎使用 HttpHandlerFactory 无法做到这一点。

但是,我找到了解决问题的解决方法:使用 HttpModule 过滤哪些请求应该转到我的自定义 HttpHandler:

首先,从 web.config 中删除对 HttpHandler 的任何引用。

然后,在 &lt;Modules&gt; 部分中添加对以下 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 中假设所有传入的请求都满足您的条件,并在那里处理所有请求。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      一般情况下是无法做到的。

      【讨论】:

        猜你喜欢
        • 2012-05-13
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        相关资源
        最近更新 更多