どのように既定のASP.NETページハンドラまたはWebサービスハンドラへの参照を取得するには?

次の httpHandlers 宣言を含む Web.config ファイルを考えてみましょう。


  

言い換えれば、このハンドラファクトリは、すべての着信要求を「参照」して、それらを処理する機会を得ようとします。ただし、必ずしも実際にすべてを処理する必要はなく、特定の実行時条件を満たすもののみを処理します。

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サービスがまだ正常に処理されるように、代わりに何を返す必要がありますか?

5
ハンドラ自体ではなく、HttpHandlerFactoryであることに気付きました。
追加された 著者 Aliostad,

4 答え

あなたのクラスが 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)
    }
}
2
追加された
それはページでは機能しますが、Webサービスでは機能しません...
追加された 著者 Timwi,
うーん..確信していない。それは私が横たわっていたコードでしたが、Webサービスには必要ありませんでした。私は基本的なハンドラを作成する他の簡単な方法を見ることはできません。 :(
追加された 著者 Chris,

私は同じ問題を抱えていましたが、そのことはHttpHandlerFactoryを使用して行うことができないようです。

しかし、私は問題を解決する回避策を見つけました:どのリクエストを私のカスタムHttpHandlerに送るべきかをHttpModuleを使ってフィルタリングする:

まず、web.configから HttpHandler への参照を削除します。

Then, add a reference to the following HttpModule inside the 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());
        }
    }

}

最後に、あなたのHttpHandlerですべての着信要求があなたの基準を満たし、すべての要求を処理すると仮定します。

2
追加された

一般的なケースでこれを行うことはできません。

0
追加された

すべての要件を知らなければ、HttpModuleは問題に適したソリューションだと言えます。

0
追加された