C# 在WCF服务中实现缓存
我有一个WCF服务,它缓存某些数据,并使用它来响应web请求。为了满足这个需求,我将服务设置为单例(使用C# 在WCF服务中实现缓存,c#,.net,wcf,caching,C#,.net,Wcf,Caching,我有一个WCF服务,它缓存某些数据,并使用它来响应web请求。为了满足这个需求,我将服务设置为单例(使用InstanceContextMode.Single和ConcurrencyMode.Multiple(是的,它是线程安全的)) 我已尝试使用以下绑定将服务超时设置为最大值: <binding name="WebHttpBinding" receiveTimeout="24.20:31:23.6470000"> <security mode="TransportCr
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服务中执行缓存是否有更好的策略?其他人在这里做了什么?有最佳实践吗?我已经在Web服务的更高层实现了缓存 通过这种方式,您可以决定何时使缓存无效,以及何时从磁盘反序列化 要确保在第一个webrequest之前构建缓存,请向
global.asax
添加一些代码,以便在加载web服务器时生成缓存
这比使用
receiveTimeout
不会影响您尝试执行的操作。您应该使用来保持服务始终运行。这样,无论何时回收,AppFabric都会自动预热您的服务。只需确保在实例化服务时构建缓存,而不是在首次访问时构建缓存。您可以使用IIS7应用程序预热模块
有一篇MSDN文章,下面引用了一段摘录: NET Framework版本4允许您在WCF Web HTTP服务中使用ASP.NET中已有的声明性缓存机制。这允许您缓存来自WCF Web HTTP服务操作的响应。当用户向配置为缓存的服务发送HTTP GET时,ASP.NET会发回缓存响应,并且不会调用服务方法。当缓存过期时,下次用户发送HTTP GET时,将调用您的服务方法并再次缓存响应 您可能还想看看:
- 再看看这个
这允许您将缓存数据的存储与WCF服务分开,这样您就可以在体系结构中更自由地管理和访问数据。我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。你是如何托管这项服务的?IIS?您是直接将数据返回给调用方,还是将数据用作处理的一部分?如果不考虑您对WCF的意见,这个答案会更好。重点是。最近WCF受挫!这个答案比其他答案更好,因为它实际上解决了这个问题,并使用了平台上可用的工具,但还需要更多的解释,也许还需要一个例子。目前它基本上是一个链接转储。
[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
...
}