如何获取对默认ASP.NET页面处理程序或Web服务处理程序的引用?

时间:2012-02-06 15:38:13

标签: asp.net ihttphandler httphandlerfactory

考虑包含以下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 个答案:

答案 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)

在一般情况下不可能这样做。