Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF服务中实现缓存_C#_.net_Wcf_Caching - Fatal编程技术网

C# 在WCF服务中实现缓存

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

我有一个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服务中执行缓存是否有更好的策略?其他人在这里做了什么?有最佳实践吗?

我已经在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服务,并移到专用缓存服务中,如或使用


这允许您将缓存数据的存储与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
   ...
}