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

C# 如何在WCF中跨进程共享静态对象?,c#,.net,wcf,caching,static,C#,.net,Wcf,Caching,Static,背景: 我询问了为我的WCF服务创建缓存提供程序结构的问题。我现在已经实现了这个设计,但我在测试中注意到,提供者实际上并没有被缓存。我怎么知道的?我已将以下调试级别日志记录添加到我的服务中: private static readonly IDictionary<string, XmlLoaderProviderBase> _providerDictionary = new Dictionary<string, XmlLoaderProviderBase>();

背景:

我询问了为我的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。因此,提供者永远不会被缓存。我如何才能让它真正缓存提供程序,并跨进程读取该字典?这可能吗


我在这里也读到了类似的问题,我注意到InstanceContextMode的设置。我不想这样,因为我认为这样会影响表现,我错了吗?远吗?简而言之,我的愿望是在所有进程/服务实例之间共享_providerDictionary。。。请帮忙

我要窃取@slfan的评论:

使用

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.Single)]

默认InstanceContextMode为PerSession

我将研究使用System.Runtime.caching.ObjectCache/MemoryCache创建自定义缓存框架。据我所知,这应该可以跨流程访问。它也是线程安全的

请参阅以下链接:


WCF服务调用不会在单独的进程中运行。没有静态对象。可以有静态类和静态类members@JohnSaunders-我会花一美元买它,但有两件事:1.对服务的连续调用每次都会显示不同的PID,2.检查提供者是否已经存在的行永远不会计算为真。请详细说明您的职位,并为我提供更多的见解?您如何主持WCF服务?在IIS中还是自托管?我认为这主要取决于您的主机是否重新启动服务进程。我会使用InstanceContextMode。不要担心性能,除非你对它进行了测量。如果你每次都得到一个新的进程,那么你最好找出是什么在破坏你原来的进程。