Как разделить статический объект между процессами в WCF? - PullRequest
0 голосов
/ 27 февраля 2012

Справочная информация:

Я задал этот вопрос о создании кэшированной структуры провайдера для моей службы 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 довольно полезен, и он показывает, что каждый вызов службы выполняется в своем собственном уникальном процессе (т. Е. Он имеет уникальный идентификатор процесса).Таким образом, провайдеры никогда не будут кэшироваться.Как я могу получить это, чтобы фактически кэшировать провайдеров, и читать этот словарь через процессы?Это вообще возможно?

Я также читал подобные вопросы к этому здесь на SO, и я замечаю настройку InstanceContextMode .Я не думаю, что хочу этого, потому что я думаю, что это снизит производительность (я ошибаюсь? Не так?) В ореховой оболочке я хочу разделить _providerDictionary среди всех процессов / экземпляров службы... пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2015

Я хотел бы изучить создание собственной инфраструктуры кэширования с использованием 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

0 голосов
/ 27 февраля 2012

Я собираюсь украсть комментарий @ slfan:

Использовать

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

По умолчанию InstanceContextMode - PerSession.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...