AppFabric的DataCacheFactory需要很长时间才能初始化,因此我尝试创建一次并在下一次请求中重复使用它。
目前,我最好的想法是将它存储在HttpContext中,但我也有一些WCF服务(没有设置HttpContext)。还有其他想法我应该在哪里以及如何处理这个问题?
谢谢!
答案 0 :(得分:2)
这是我在过去几个月里一直在考虑的一个问题,但我没有想出一个明确的答案......
我不确定HttpContext是保留它的合适位置 - 根据this page“将在请求开始时创建一个新的HttpContext对象,并在请求完成时销毁”,所以我'请注意,如果您将DataCacheFactory放入HttpContext,那么当请求管道完成时您将丢失它。 (HttpContext不是我特别需要使用的对象所以我可能完全错了!)
但是,我认为有很多选择:
如果您使用Singleton pattern 用于创建DataCacheFactory(Jon Skeet有一个优秀的作品 用C#做单身人士 线程安全here),. Singleton基本上会照顾 存储DataCacheFactory 你在实例领域。
此选项感觉有点不正常,但您可以将DataCacheFactory保留在ASP.NET缓存中。不是WCF开发人员,我不知道您有什么访问权限,但如果您可以访问HttpRuntime对象,则可以从那里访问缓存。
您可能要考虑的另一个选项是将DataCacheFactory存储在Application状态,尽管我认为这可能也很难从WCF服务访问,因为它通常通过HttpContext访问。
答案 1 :(得分:0)
我在使用MemoryCache的WCF中解决了这个问题。将AppFabric缓存对象存储在内存中,这样您就不必调用DataCacheFactory的昂贵初始化。
Private Shared _memCache As MemoryCache
Public Shared ReadOnly Property Cache As DataCache
Get
If _memCache Is Nothing Then
_memCache = MemoryCache.Default
Dim factory As New DataCacheFactory
_memCache("memCache") = factory.GetCache("appFabricCache")
End If
Return CType(_memCache("memCache"), DataCache)
End Get
End Property
尝试使用HttpContext不是WCF的方法。
您需要包含的库:
Imports System.Runtime.Caching
Imports Microsoft.ApplicationServer.Caching