6

再利用可能な HTTPHandlers に問題があります。IsReusableプロパティの仕組みを確認したかったのです。そこで、2 つのハンドラーを作成しました。

再利用可能:

public class ReusableHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    private int _counter;

    public ReusableHandler()
    {
        _counter = 0;
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Write("Reusable: " + _counter++);
    }

}

再利用不可:

public class NonReusableHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    private int _counter;

    public NonReusableHandler()
    {
        _counter = 0;
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Write("NonReusable: " + _counter++);
    }

}

どちらも期待どおりに機能します。 Reusable は毎回増分値を返しますが、 NonReusable は毎回 0 を返します。しかし、ハンドラーを WebHandlers (*.ashx) として使用すると、両方とも毎回 0 を返します (コードはまったく同じです)。WebHandlers を使用するとIsReusableプロパティが無視されるということですか?

4

1 に答える 1

2

デフォルトの.NET構成では、タイプを使用して.のSystem.Web.UI.SimpleHandlerFactory要求を処理します*.ashx。これは、IISマネージャーの[Httpハンドラー]セクションで確認できます。

このファクトリのソースコードを見ると、IsReusableプロパティがまったくチェックされていないことがわかります。また、ステートレスです。作成されたインスタンスはキャッシュされません。代わりに、このプロパティを使用しているファクトリクラスを確認するには、を参照してくださいSystem.Web.Configuration.HandlerFactoryWrapper

ここで、メソッドSystem.Web.HttpApplication.RecycleHandlers()を間接的に呼び出すだけであることがわかりますSystem.Web.IHttpHandlerFactory.ReleaseHandler()(次の段落で説明するファクトリキャッシュは、それ自体でハンドラインスタンスのキャッシュを行いません)。IsReusableアプリケーション自体はプロパティを無視し(ファクトリがそれを行うことになっています)、以前に発見されたように、.ashxファイルはインスタンスを再利用しないファクトリを使用します。

System.Web.HttpApplication.GetFactory()キャッシュを使用しているように見えますが、そのキャッシュはファクトリ自体のインスタンスのみを格納することにも注意してください(指定されている場合)。明示的なファクトリが指定されていない場合、メソッドはHandlerFactoryWrapper上記を作成します(これにより、ハンドラーインスタンスがキャッシュされます)。

私が見る限り、.NET Frameworkには、独自のファクトリクラスを作成することはできますが、代わりに使用できるファクトリクラスはSimpleHandlerFactoryありません(HandlerFactoryWrapperパラメータなしのコンストラクタはありません)。

于 2013-02-18T16:41:20.877 に答える