2012-05-13 11 views
6

再利用可能なHTTPHandlersに問題があります。私はIsReusableプロパティがどのように機能するのか調べたいと思っていました。WebHandlerを使用したHTTPHandlerとIsReusable

再利用可能:

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++); 
    } 

} 

ではなく、再利用可能:だから私は2つのハンドラを作成しました

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++); 
    } 

} 

彼らは期待通りの仕事の両方:再使用不可は、すべて0を返しながら、再利用可能な各時間が戻るが、値をインクリメント時間。しかし、ハンドラをWebHandlers(* .ashx)として使用すると、毎回0を返します(コードはまったく同じです)。 WebHandlersを使用すると、IsReusableプロパティは無視されますか?

答えて

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を作成します(ハンドラインスタンスをキャッシュします)。

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

関連する問題