如何在WCF中跨进程共享静态对象?

时间:2012-02-27 16:25:33

标签: c# .net wcf caching static

背景:

我问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 ...请帮忙!

2 个答案:

答案 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