jpb*_*chi 12 .net wcf .net-4.0
我有一个工作的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)
Run Code Online (Sandbox Code Playgroud)
以前有人见过吗?它是.NET Framework中的一个错误(顺便说一句,我使用的是4.0)?
关于我的ServiceHost可能相关的信息:
IInstanceProvider用于创建实例;ReliableSession已打开;ServiceBehavior以下内容;.
[ServiceBehavior(
IncludeExceptionDetailInFaults = true,
InstanceContextMode=InstanceContextMode.PerSession,
ConcurrencyMode=ConcurrencyMode.Reentrant,
UseSynchronizationContext = false
)]
Run Code Online (Sandbox Code Playgroud)
我愿意透露您可能想了解的有关该应用程序的任何额外信息.
更新1我编译了面向.NET 3.5的应用程序,但没有发生错误.不幸的是,我必须停用所依赖的所有东西Task.
更新2我在Microsoft Connect上记录了有关此问题的错误.我想现在已经回答了这个问题.
这是.NET Framework 4.0的错误.我在Microsoft Connect上记录了一个关于它的错误.
以下是微软的答案:
这看起来像是由ServiceHost的紧密关闭/打开序列中的计时问题引起的已知问题.ServiceHost维护一些可能无法收集垃圾的性能计数器,从而导致此异常.我假设您正在使用.Net Framework 4.0?请在打开第二个ServiceHost之前尝试通过强制GC进行解决方法:
GC.Collect()
GC.WaitForPendingFinalizers()
Run Code Online (Sandbox Code Playgroud)
做他们建议的事情解决了这个问题.我希望它能在以后的版本中修复.
小智 6
此问题与WCF服务本身无关,但与System.ServiceModel.Diagnostics无关,它允许通过性能计数器监视服务.它为每个服务主机创建计数器集,并为ServiceHost参数生成set.并且,如果已存在具有相同参数的主机,则会导致此异常.请参阅此处的Microsoft源代码(由GUID找到).它很容易避免:只需关闭服务的性能计数器:
通过app.config(测试)
<configuration>
<system.serviceModel>
<diagnostics performanceCounters="Off" />
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)在运行时(未测试)
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();
Run Code Online (Sandbox Code Playgroud)PS我在VS 2012,.Net 4.5和VS 2010,.Net 4.0上遇到了这个问题.我认为,它与软件配置(VS?)有关,但我不知道哪个软件和哪个参数.我的同事在一般情况下使用同样的环境没有这样的问题.