我有一个(经典的)云服务,该服务需要创建一个昂贵的对象,并希望在后续请求中重用该对象。创建需要很长时间,因此每次创建它都会减慢请求的速度。
public class MyService : IHttpHandler
{
public static ExpensiveObject MyObject;
public void ProcessRequest(HttpContext context)
{
if (MyObject == null)
MyObject = new ExpensiveObject(); // very time consuming operation
// do stuff with MyObject
}
}
(我意识到不必考虑同时运行多个并发请求,请忽略这一点)当我发布两个请求时,一个接一个地发布,每次都会创建一个新的MyObject
。如何确保它重复使用为每个请求创建的相同对象?
将IsReusable
设置为在MyService
中返回true似乎没有什么区别。
答案 0 :(得分:1)
如果您在IIS中运行,您不能。应用程序池正在工作。此外,多个请求通常不会在处理过程中跨越路径。
您的典型选项包括以下内容。每个线程只会创建一项昂贵的服务:
-祝你好运!
答案 1 :(得分:1)
您似乎需要将共享对象从HttpHandler移出到单独的托管服务,例如Azure App Service,Azure WebJob(并非适合所有使用场景)等。
Azure App Service场景:Web应用通过HTTP与App Service通信(请参阅HttpClient)。 Azure App Service具有配置选项Always On,即使没有流量,该选项也可以使应用程序保持加载状态。
如果您处理的是长时间运行的操作(尽管您写的是长期初始化问题),那么看一下解决这些问题的标准REST模式-Polling。
答案 2 :(得分:0)
要轻松实现这一目标(无需处理神秘的Azure废话),我只是制作了一个单独的可执行文件,该文件将ExpensiveObject
托管在Nancy本地服务器中(从启动脚本中启动)。
就我而言,这没有明显的缺点,因为我只需要请求对象使用一个字符串并返回另一个字符串即可。但是,这可能不是所有人的正确解决方案。