Azure云服务:跨不同请求维护对象引用

时间:2019-05-24 05:21:57

标签: c# azure-cloud-services

我有一个(经典的)云服务,该服务需要创建一个昂贵的对象,并希望在后续请求中重用该对象。创建需要很长时间,因此每次创建它都会减慢请求的速度。

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似乎没有什么区别。

3 个答案:

答案 0 :(得分:1)

如果您在IIS中运行,您不能。应用程序池正在工作。此外,多个请求通常不会在处理过程中跨越路径。

您的典型选项包括以下内容。每个线程只会创建一项昂贵的服务:

  1. IoC为每个线程(或请求范围)注册服务的生命周期。
  2. 单例(已使用应用程序池)

-祝你好运!

答案 1 :(得分:1)

您似乎需要将共享对象从HttpHandler移出到单独的托管服务,例如Azure App Service,Azure WebJob(并非适合所有使用场景)等。

Azure App Service场景:Web应用通过HTTP与App Service通信(请参阅HttpClient)。 Azure App Service具有配置选项Always On,即使没有流量,该选项也可以使应用程序保持加载状态。

如果您处理的是长时间运行的操作(尽管您写的是长期初始化问题),那么看一下解决这些问题的标准REST模式-Polling

也许此链接对您有用:Common causes of Cloud Service roles recycling

答案 2 :(得分:0)

要轻松实现这一目标(无需处理神秘的Azure废话),我只是制作了一个单独的可执行文件,该文件将ExpensiveObject托管在Nancy本地服务器中(从启动脚本中启动)。

就我而言,这没有明显的缺点,因为我只需要请求对象使用一个字符串并返回另一个字符串即可。但是,这可能不是所有人的正确解决方案。