12

Ashxと一緒に使っていjQueryます。msdnを読んだことがありIHttpHandler.IsReusableます。プロパティについて話しているのです。

別の要求が IHttpHandler インスタンスを使用できるかどうかを示す値を取得します。

" " とはどういう意味the IHttpHandler instance.ですか? static彼らは誰もが見たり使ったりできるようにそれを同じようにしようとしていますか? 同じもので再利用可能ですか?(クエリ文字列、クッキーなど?)

これを書くと:

public class MyHttpHandler : IHttpHandler
   {
      public void ProcessRequest(HttpContext context)
      {
         context.Response.Write(DateTime.Now.Ticks.ToString());      
      }

      public bool IsReusable
      {
         get { return true; }
      }
   }

各リクエストが独自の最新のDatetimeを取得するようです。

4

4 に答える 4

15

あなたの例では、状態を管理していません。誰でもProcessRequest同じインスタンスで何度でも呼び出すことができ、新しい DateTime を取得します。

しかし、次のようにした場合はどうでしょう。

private DateTime _dateTime = DateTime.Now;

public void ProcessRequest(HttpContext context)
{
    context.Response.Write(_dateTime);
}

これで、ハンドラー インスタンスがインスタンス化された後、毎回同じ応答が得られます。ASP.NET が毎回新しいものを生成しない限り。

IsReusable個別のリクエスト間で共有してもよい状態をハンドラー クラスが管理しているかどうかを示すことができます。共有が許可されていない状態を管理する場合、外部的に冪等である可能性は低く、スレッドセーフではない可能性さえあります。特定のハンドラーの実装には、出力を決定するときに共有できないインスタンス レベルの変数も含まれているため、同じ入力条件で呼び出しProcessRequestても同じ出力にはならない場合があります。(実際、技術的には、現在の実装がその例です)。これらの場合、インスタンスはおそらく「再利用可能」ではなく、ASP.NET は予測可能性を確保するために毎回新しいインスタンスを生成する必要があります。

したがって、状態を管理しない場合、または状態が「明らか」な非常に単純なハンドラー (ここにある例のように) がある場合は、IsResuable無意味に見えるかもしれません。しかし、非常に複雑なハンドラー (初期化にコストがかかるが共有しても問題ない状態を保持する可能性があるハンドラー) がある場合は、パフォーマンスのためにそれを再利用しても問題ないことを ASP.NET に示す必要があります。

于 2012-05-29T20:33:36.463 に答える
1

回答へのリンクを投稿するだけで申し訳ありませんが、 IsReusable の優れた説明:

IsReusable ブログ投稿

コードが完全にスレッド セーフである場合は基本的にオンにし、そうでない場合はオフのままにします。それは私がそれから集めたものです。

于 2012-05-29T20:36:28.817 に答える
0

そこにインスタンス変数がある場合、それは多数の呼び出しで共有されていることがわかると思います。そのため、日付時刻がインスタンス変数として設定されていて、プロセスリクエストでそれを返すだけの場合、同じ値を返すと思いますが、ハンドラーの新しいインスタンスを作成するため、 isreusable = false の場合はそうではありません。

于 2012-05-29T20:35:21.083 に答える
0

どうやら、これによりハンドラーがメモリに保持され、複数のリクエストを処理できるようになります。false に設定すると、着信要求ごとにハンドラーの新しいインスタンスを作成する必要があります。

public bool IsReusable
{
    get
    {
        return true;
    }
}
于 2012-05-29T20:37:11.877 に答える