在 WCF 服务中实现缓存

本文关键字:实现 缓存 服务 WCF | 更新日期: 2023-09-27 18:33:01

我有一个 WCF 服务,它缓存某些数据并使用它来响应 Web 请求。为了满足这个要求,我将该服务设置为单例(使用 InstanceContextMode.SingleConcurrencyMode.Multiple(是的,它是线程安全的((。

我尝试使用以下绑定将服务的超时设置为最大值:

 <binding name="WebHttpBinding" receiveTimeout="24.20:31:23.6470000">
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="None" />
    </security>
 </binding>

我的问题是服务实例以不可预测的时间间隔死亡,这意味着第一个要命中的 Web 请求将导致缓存重建(一个非常缓慢的过程(。

理想情况下,缓存将在每天的设定时间重建,而不必受到 Web 请求的命中。我可以将应用程序池设置为在设定的时间回收,但这仍然无法解决服务在第一个 Web 请求之前未实例化的问题。我宁愿不必制作一个小的计划脚本来向服务发送请求,因为这有点笨拙。

是否有更好的策略在 WCF 服务中执行缓存?其他人在这里做了什么?是否有最佳实践?

在 WCF 服务中实现缓存

有一篇关于 WCF Web HTTP 服务的缓存支持的 MSDN 文章,摘录如下:

使用 .NET Framework 版本 4 可以在 WCF Web HTTP 服务中使用已在 ASP.NET 中提供的声明性缓存机制。这允许您缓存来自 WCF Web HTTP 服务操作的响应。当用户向配置为缓存的服务发送 HTTP GET 时,ASP.NET 发回缓存的响应,并且不会调用服务方法。当缓存过期时,下次用户发送HTTP GET时,将调用您的服务方法并再次缓存响应......

您可能还想查看:

  • 内存缓存
  • Windows AppFabric
  • NCache
  • 缓存解决方案
  • WCF 缓存解决方案 - 需要建议
  • 另请参阅Microsoft

我已经在Web服务内部的更高层实现了缓存。

这样,您可以决定何时使缓存失效,以及何时从磁盘反序列化。

若要确保在第一个 Web 请求之前构建缓存,请向global.asax添加一些代码,以便在加载 Web 服务器时生成缓存。

这比以"正确的方式"做要简单得多

[OperationContract]
public void GetLargeComplexData();
public GetLargeComplexData()
{
   // deserialize last cached data from db or file
   ...
   // Verify the deserialized cache is not invalid
   ...
   // if cache is invalid rebuild
   ...
   //return cached data
   ...
}
receiveTimeout不会影响

您要执行的操作。 您应该使用 AppFabric 来保持服务始终运行。 这样,只要您回收,AppFabric 都会自动预热您的服务。 只需确保在实例化服务时(而不是首次访问服务(时生成缓存即可。

您可以使用 IIS7 应用程序预热模块

http://blogs.iis.net/thomad/archive/2009/10/14/now-available-the-iis-7-5-application-warm-up-module.aspx

您可以使用

的一个选项是将缓存移出 WCF 服务并移入专用缓存服务(如 Memcached(或使用 AppFabric 缓存Microsoft

这允许您将缓存数据的存储与 WCF 服务分开,以便在如何管理和访问数据的体系结构中拥有更大的自由度。