问题 重新打开ServiceHost时,WCF“CounterSet中已存在实例”错误


我有一个工作的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中的错误 关于这个问题。我想现在已经回答了这个问题。


8656
2018-06-04 20:35


起源

您可以提供完整的堆栈跟踪信息吗? - CARLOS LOTH
堆栈跟踪是空的 Exception - jpbochi


答案:


这是.NET Framework 4.0的错误。我记录了一个 Microsoft Connect中的错误 关于它。

以下是微软的答案:

这看起来像是一个已知的问题   通过紧密关闭/打开时间问题   ServiceHost序列。的ServiceHost   维护一些性能指标   可能不会收集垃圾   导致这个例外。我假设   您正在使用.Net Framework 4.0?   请尝试通过做一个解决方法   在打开第二个之前强制GC   ServiceHost的:

GC.Collect() 
GC.WaitForPendingFinalizers()

做他们建议的事情解决了这个问题。我希望它能在以后的版本中修复。


7
2018-06-04 21:26



或者回来了。 :(自从我最后一次更新MS安全建议后,我得到了这个。我在代码中看到的唯一区别是我使用的是UDP端点,而不是TCP端点。添加GC解决方法并没有解决问题。我我会在MS看到我能找到的东西。 - Jesse Chisholm
对我来说这个解决方案解决了这个问谢谢! - Ikaso


此问题与WCF服务本身无关,而与System.ServiceModel.Diagnostics无关,它允许通过性能计数器监视服务。它为每个服务主机创建计数器集,并为ServiceHost参数生成set。并且,如果已存在具有相同参数的主机,则会导致此异常。 请参阅此处的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();
    

附:我在VS 2012,.Net 4.5和VS 2010,.Net 4.0上遇到了这个问题。我认为,它与软件配置(VS?)有关,但我不知道哪个软件和哪个参数。我的同事在一般情况下使用同样的环境没有这样的问题。


4
2017-07-08 09:13