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.
您的典型选项包括以下内容。它只会为每个线程创建一个昂贵的服务:
- IoC 为每个线程(或请求范围)注册服务的生命周期。
- 单例(已在使用的应用程序池)
-祝你好运!
看来您需要将共享对象从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 另一个字符串。然而,这可能不是适合所有人的正确解决方案。
我有一个(经典)云服务需要创建一个昂贵的对象,我想在后续请求中重复使用该对象。创建它需要很长时间,因此每次创建它都会使请求减慢得令人无法接受。
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.
您的典型选项包括以下内容。它只会为每个线程创建一个昂贵的服务:
- IoC 为每个线程(或请求范围)注册服务的生命周期。
- 单例(已在使用的应用程序池)
-祝你好运!
看来您需要将共享对象从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 另一个字符串。然而,这可能不是适合所有人的正确解决方案。