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

Azure Cloud Services: maintaining object references across different requests

我有一个(经典)云服务需要创建一个昂贵的对象,我想在后续请求中重复使用该对象。创建它需要很长时间,因此每次创建它都会使请求减慢得令人无法接受。

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
    }
}

(我意识到对多个并发请求的缺乏考虑运行,请无视)当我post两个请求时,一个接一个,它创建一个新的MyObject每一次。我如何确保它重复使用为每个请求创建的相同对象?

MyService 中将 IsReusable 设置为 return true 似乎没有任何区别。

如果你 运行 在 IIS 中 你不能。应用程序池正在工作。此外,多个请求通常不会跨越路径 in-process.

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

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

-祝你好运!

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

Azure 应用服务场景:Web 应用通过 HTTP 与应用服务通信(参见 HttpClient). Azure App Service has the configuration option Always On 即使没有流量也能保持应用加载。

如果您处理 long-running 操作(尽管您写的问题是 long-initialization),那么查看解决此类问题的标准 REST-pattern 是有意义的 - Polling.

也许这个link对你有用:Common causes of Cloud Service roles recycling

为了轻松实现这一点(无需处理神秘的 Azure 废话),我刚刚制作了一个单独的可执行文件,在 Nancy 本地主机服务器中托管 ExpensiveObject(在启动脚本中启动)。

在我的例子中,这没有明显的缺点,因为我只需要请求对象使用一个字符串和 return 另一个字符串。然而,这可能不是适合所有人的正确解决方案。