在 WCF 服务中实现缓存
本文关键字:实现 缓存 服务 WCF | 更新日期: 2023-09-27 18:33:01
我有一个 WCF 服务,它缓存某些数据并使用它来响应 Web 请求。为了满足这个要求,我将该服务设置为单例(使用 InstanceContextMode.Single
和 ConcurrencyMode.Multiple
(是的,它是线程安全的((。
我尝试使用以下绑定将服务的超时设置为最大值:
<binding name="WebHttpBinding" receiveTimeout="24.20:31:23.6470000">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="None" />
</security>
</binding>
我的问题是服务实例以不可预测的时间间隔死亡,这意味着第一个要命中的 Web 请求将导致缓存重建(一个非常缓慢的过程(。
理想情况下,缓存将在每天的设定时间重建,而不必受到 Web 请求的命中。我可以将应用程序池设置为在设定的时间回收,但这仍然无法解决服务在第一个 Web 请求之前未实例化的问题。我宁愿不必制作一个小的计划脚本来向服务发送请求,因为这有点笨拙。
是否有更好的策略在 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 服务分开,以便在如何管理和访问数据的体系结构中拥有更大的自由度。