如果是一个普通的HttpHandler(一个ASHX,IHttpHandler接口)可重复使用的?(

2019-07-29 15:21发布

我一直在使用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价值。

Answer 1:

在你的榜样,你不管理任何状态。 任何人都可以拨打ProcessRequest多次,他们希望在同一实例,他们将得到一个新的日期时间。

但是,如果你做了什么,这一点:

private DateTime _dateTime = DateTime.Now;

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

现在,你每次都得到同样的回应处理程序实例实例化后。 除非ASP.NET生成一个新的每次。

IsReusable可以表明你的处理程序类是否管理这是确定的独立请求之间共享任何状态。 如果管理状态也不行分享,那么它不太可能是外部幂等 - 或者甚至可能不是线程安全的。 调用ProcessRequest以相同的输入条件可能不会导致相同的输出,因为你的具体处理程序实现也有一些实例级别的变量时,它决定了输出也不行分享。 (事实上​​,在技术上你当前的实现就是一个很好的例子)。 在这些情况下,例如可能不是“可重复使用的” - 和ASP.NET需要每次确保可预测性,以产生一个新的实例。

所以,你不管理国家,或者你有非常简单的处理,其中状态是“明显”的情况下(就像我们这里的例子), IsResuable也许显得毫无意义。 但是,如果你有一个非常复杂的处理程序 - 可能是一个,它保留一些状态是昂贵的初始化,但OK分享 - 你想指示ASP.NET没关系重用它的性能。



Answer 2:

对不起,刚刚张贴的链接答案,但IsReusable的很好的解释:

IsReusable博客文章

本质上打开它,如果你的代码是完全线程安全的,请将其关闭,如果它不是。 那么这就是我从中收集。



Answer 3:

如果你在那里有一个实例变量,我想你会发现它在众多来电共享,所以如果你的约会时间也被设定为一个实例变量,你只返回你的processRequest我认为它会返回相同的值,而不会,如果isreusable =假,因为它会创建的处理程序的新实例。



Answer 4:

显然,这在内存中保存,并能够处理多个请求的处理程序。 当设置为false,它创造了处理器的新实例为每个到来的请求。

public bool IsReusable
{
    get
    {
        return true;
    }
}


文章来源: When is a Generic HttpHandler (an ashx, the IHttpHandler interface) reusable?