问题 什么时候Generic HttpHandler(一个ashx,IHttpHandler接口)可重用?


我一直在用 Ashx 随着 jQuery。我读了 MSDN,我在谈论 IHttpHandler.IsReusable 属性。

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

他们的意思是什么 ”the IHttpHandler instance.“他们试图让它变得相似吗? static 供大家看和使用?它是否可以重复使用? 什么 ? (QueryString,cookies等?)

如果我写这个:

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

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

似乎每个请求都会得到它 拥有最新的  - Datetime 值。


3942
2018-05-29 20:25


起源



答案:


在您的示例中,您不管理任何州。任何人都可以致电 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指出可以重用它来提高性能。


13
2018-05-29 20:33



我永远找不到适合这个的MSDN文档:/ - IrishChieftain
@IrishChieftain也针对这个问题,我问过(并没有得到任何好的asnwer)-lousy msdn documenetation ... stackoverflow.com/questions/8298843/... - Royi Namir
看看Branislav的回复: stackoverflow.com/questions/1507572/... - IrishChieftain
@IrishChieftain所以它实际上试图使其静态相似? - Royi Namir
@RoyiNamir,如果我理解你的意思,那么是的。它采用类似单一的方法,它将保存HttpHandler的单个静态实例并反复使用它。 - Rex M


答案:


在您的示例中,您不管理任何州。任何人都可以致电 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指出可以重用它来提高性能。


13
2018-05-29 20:33



我永远找不到适合这个的MSDN文档:/ - IrishChieftain
@IrishChieftain也针对这个问题,我问过(并没有得到任何好的asnwer)-lousy msdn documenetation ... stackoverflow.com/questions/8298843/... - Royi Namir
看看Branislav的回复: stackoverflow.com/questions/1507572/... - IrishChieftain
@IrishChieftain所以它实际上试图使其静态相似? - Royi Namir
@RoyiNamir,如果我理解你的意思,那么是的。它采用类似单一的方法,它将保存HttpHandler的单个静态实例并反复使用它。 - Rex M


很抱歉只是发布一个答案的链接,但是对IsReusable的一个很好的解释:

IsReusable博客文章

如果您的代码完全是线程安全的话,基本上将其打开,如果不是,请将其关闭。那就是我从中收集到的东西。


1
2018-05-29 20:36





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


0
2018-05-29 20:35





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

public bool IsReusable
{
    get
    {
        return true;
    }
}

0
2018-05-29 20:37



是的...我知道这一点。问题标题是“真正使用......” - Royi Namir
我们Royi之间的语言困难,你能否以某种方式重新表达它,因为我不确定你到底是什么意思:) - IrishChieftain
当然...... :)我已经知道了财产的含义。 ....但我正在寻找一个真实的场景(样本),我必须决定是真还是假...... - Royi Namir
请参阅我在Rex的答案下发表的评论(链接到较旧的SO问题) - IrishChieftain