12

我一直在AshxjQuery. 我读过msdn,我说的是IHttpHandler.IsReusable属性。

获取一个值,该值指示另一个请求是否可以使用 IHttpHandler 实例。

他们的“”是什么意思the IHttpHandler instance.?他们是否试图让static每个人都可以看到和使用它?它可以被相同的东西重复使用吗?(查询字符串、cookie 等?)

如果我写这个:

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

如果你有一个实例变量,我想你会发现它在许多调用中共享,所以如果你的日期时间设置为实例变量并且你只是在你的 processrequest 中返回它,我认为它会返回相同的值,而如果 isreusable = false 则不会,因为它将创建处理程序的新实例。

于 2012-05-29T20:35:21.083 回答
0

显然,这将处理程序保留在内存中并能够处理多个请求。当设置为 false 时,它​​必须为每个传入请求创建一个新的处理程序实例。

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