Ошибка WCF «Экземпляр уже существует в CounterSet» при повторном открытии ServiceHost - PullRequest
12 голосов
/ 05 июня 2010

У меня есть рабочий ServiceHost с одним NetTcpBinding и одной конечной точкой.

Я .Close() это. Затем я создаю новый экземпляр ServiceHost с точно такой же конфигурацией, как и первый. Затем, когда я пытаюсь .Open() новый экземпляр, я получаю это очень неловкое исключение:

System.ArgumentException occurred
  Message=Instance 'LobbyService@net.tcp:||localhost:2718|game|' already exists in CounterSet 'e829b6db-21ab-453b-83c9-d980ec708edd'.
Parameter name: InstanceName
  Source=System.Core
  ParamName=InstanceName
  StackTrace:
       at System.Diagnostics.PerformanceData.CounterSetInstance..ctor(CounterSet counterSetDefined, String instanceName)

Кто-нибудь видел это раньше? Это ошибка в .NET Framework (кстати, я использую 4.0)?

Вероятно, актуальная информация о моем ServiceHost:

  • Клиенты не подключены к хосту при его первом закрытии;
  • Пользовательский IInstanceProvider используется для создания экземпляров;
  • Переплет ReliableSession включен;
  • Тип услуги помечен ServiceBehavior ниже;

.

[ServiceBehavior(
IncludeExceptionDetailInFaults = true,
InstanceContextMode=InstanceContextMode.PerSession,
ConcurrencyMode=ConcurrencyMode.Reentrant,
UseSynchronizationContext = false
)]

Я открыт, чтобы раскрыть любую дополнительную информацию, которую вы, возможно, захотите узнать о приложении.

Обновление 1 Я скомпилировал приложение для .NET 3.5, и ошибка НЕ ​​произошла. К сожалению, я должен деактивировать все, что полагалось на Task.

Обновление 2 Я зарегистрировал ошибку в Microsoft Connect об этой проблеме. Я думаю, что на этот вопрос уже дан ответ.

Ответы [ 2 ]

7 голосов
/ 05 июня 2010

Это ошибка в .NET Framework 4.0. Я зарегистрировал ошибку в Microsoft Connect об этом.

Вот ответ от Microsoft:

Это похоже на известную проблему, вызванную по времени проблемы в тесном Закрыть / открыть последовательность ServiceHost. ServiceHost поддерживает некоторые счетчики производительности это может не собрать мусор приводя к этому исключению. Я предполагаю вы используете .Net Framework 4.0? Пожалуйста, попробуйте обойти, выполнив принудительный сборщик мусора перед открытием второго ServiceHost:

GC.Collect() 
GC.WaitForPendingFinalizers()

Выполнение того, что они посоветовали, решило проблему. Я надеюсь, что это будет исправлено в более позднем выпуске.

6 голосов
/ 08 июля 2014

Эта проблема не имеет отношения к самой службе WCF, но относится к System.ServiceModel.Diagnostics, которая позволяет отслеживать службу по счетчикам производительности. Он создает набор счетчиков для каждого хоста службы и генерирует имя для набора параметров ServiceHost. И, если хост с такими же параметрами уже существует - это вызовет это исключение. См. Источники Microsoft здесь (был найден по GUID). Это легко сделать: просто отключите счетчики производительности для сервисов:

  1. По app.config (проверено)

    <configuration>
        <system.serviceModel>
            <diagnostics performanceCounters="Off" />
        </system.serviceModel>
    </configuration>
    
  2. во время выполнения (не проверено)

    using System.Configuration;
    using System.ServiceModel.Configuration;
    using System.ServiceModel.Diagnostics;
    
    Configuration config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
    ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(config);
    sg.Diagnostic.PerformanceCounters = PerformanceCounterScope.Off;
    config.Save();
    

P.S. Я получил эту проблему на VS 2012, .Net 4.5 и VS 2010, .Net 4.0. Я думаю, это связано с конфигурацией программного обеспечения (VS?), Но я понятия не имею, какое программное обеспечение и какой параметр. Мои коллеги не имеют такой проблемы, используя, в общем, ту же среду.

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