2013-09-26 98 views
4

缓存我有一定的缓存数据,并使用它来响应网络请求的WCF服务。为了处理这个需求,我把这个服务变成了一个Singleton(使用InstanceContextMode.SingleConcurrencyMode.Multiple(是的,它是线程安全的))。实现在WCF服务

我试着使用设置服务其最大的超时以下绑定:

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

我的问题是,服务实例死在不可预知的时间间隔,这意味着第一个Web请求打会导致缓存重建(一个非常缓慢的过程)。

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

是否有一个WCF服务进行缓存更好的策略?别人在这里做了什么?有最佳做法吗?

+1

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

你是如何托管这项服务的? IIS? –

+0

您是否*直接将数据提供给调用者*,或者您是否将数据用作处理的一部分*? – zimdanen

回答

1

我已在web服务内的更高的层中实现高速缓存。

这样你就可以决定何时缓存失效,而当从磁盘反序列化。

要确保缓存第一WebRequest的前建成,添加一些代码global.asax产生在Web服务器的负载缓存。

这比做得简单的“right way

[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 
    ... 
} 
+4

没有你对WCF的意见,这个答案会更好。 –

+1

采取的一点。最近的WCF沮丧! –

0

receiveTimeout不会影响到你想要做什么。您应该使用AppFabric来保持您的服务始终运行。这样,无论何时回收,AppFabric都会自动预热您的服务。只要确保在实例化服务时创建缓存,而不是在第一次访问服务时创建缓存。

4

有上Caching Support for WCF Web HTTP Services的MSDN文章,摘录引述如下:

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

你可能也想看看:

+1

这个答案比其他人更好,因为它实际上解决了问题并使用了平台上可用的工具,但需要更多的解释和示例。目前它基本上是一个链接转储。 –

0

您可以使用一个选项是将缓存从WCF服务,并成为一个专用缓存服务,如Memcached或使用Microsoft AppFabric Caching

这可以让你的存储分开缓存数据WCF服务,以便您可以更自由地管理和访问数据。