背景:
我问this question有关为我的WCF服务创建缓存的提供程序结构的问题。我现在已经实现了这个设计,但是我在测试中注意到的是,提供程序实际上并没有被缓存。我怎么知道这个?我将以下调试级别的日志记录添加到我的服务中:
private static readonly IDictionary<string, XmlLoaderProviderBase> _providerDictionary =
new Dictionary<string, XmlLoaderProviderBase>();
public void Load(LoadRequest loadRequest)
{
XmlLoaderProviderBase xmlLoader;
if (_providerDictionary.ContainsKey(loadRequest.TransferTypeCode))
{
// Use cached provider...
xmlLoader = _providerDictionary[loadRequest.TransferTypeCode];
Logger.Log.DebugFormat("Found cached provider: {0} for transfer type: {1}",
xmlLoader.GetType(), loadRequest.TransferTypeCode);
}
else
{
// Instantiate provider for the first time; add provider to cache...
xmlLoader = XmlLoaderProviderFactory.CreateProvider(loadRequest.TransferTypeCode);
_providerDictionary.Add(loadRequest.TransferTypeCode, xmlLoader);
Logger.Log.DebugFormat("Instantiating provider: {0} for transfer type: {1}",
xmlLoader.GetType(), loadRequest.TransferTypeCode);
}
xmlLoader.Load(loadRequest);
}
而我注意到的是,无论我多少次调用该服务,提供者总是被实例化(它永远不会找到缓存版本)。值得庆幸的是,log4net非常有用,它表明每次调用服务都运行在它自己独特的进程中(即它具有唯一的进程ID)。因此,提供程序永远不会被缓存。我怎样才能实现缓存提供程序,并跨进程读取该字典?这甚至可能吗?
我也在SO上阅读了类似的问题,我注意到 InstanceContextMode 设置。我不认为我想要这个,因为我认为这会损害性能(我错了吗?离开?)在坚果壳中,我希望在所有进程/服务实例之间共享 _providerDictionary ...请帮忙!
答案 0 :(得分:0)
我要偷@slfan的评论:
使用
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.Single)]
默认InstanceContextMode是PerSession。
答案 1 :(得分:0)
我将研究使用System.Runtime.Caching.ObjectCache / MemoryCache创建自定义缓存框架。据我所知,这应该可以跨进程访问。它也是线程安全的。
请参阅以下链接:
http://technovivek.blogspot.com/2013/08/c-in-memory-cache-using-net-40-object.html
http://www.codeproject.com/Articles/290935/Using-MemoryCache-in-Net