Dot-Net

重新打開 ServiceHost 時出現 WCF“CounterSet 中已存在實例”錯誤

  • July 8, 2014

我有一個具有單個 NetTcpBinding 和單個端點的工作 ServiceHost。

.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’s.

更新 2在 Microsoft Connect 上記錄了一個關於此問題的錯誤。我想這個問題現在已經回答了。

這是 .NET Framework 4.0 的一個錯誤。我在 Microsoft Connect 上記錄了一個關於它的錯誤。

以下是微軟的回答:

這看起來像是由 ServiceHost 的緊密關閉/打開序列中的時序問題引起的已知問題。ServiceHost 維護一些性能計數器,這些計數器可能無法進行垃圾收集,從而導致此異常。我假設您使用的是 .Net Framework 4.0?在打開第二個 ServiceHost 之前,請嘗試通過強制 GC 來解決:

GC.Collect() 
GC.WaitForPendingFinalizers()

按照他們的建議解決了這個問題。我希望它在以後的版本中得到修復。

此問題與 WCF 服務本身無關,但與允許通過性能計數器監視服務的 System.ServiceModel.Diagnostics 無關。它為每個服務主機創建計數器集,並為由 ServiceHost 參數設置的名稱生成名稱。而且,如果已經存在具有相同參數的主機 - 它將導致此異常。請參閱此處的 Microsoft 來源(由 GUID 找到)。很容易避免它:只需關閉服務的性能計數器:

  1. 通過 app.config(已測試)
<configuration>
   <system.serviceModel>
       <diagnostics performanceCounters="Off" />
   </system.serviceModel>
</configuration>
  1. 在執行時(未測試)
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();

PS 我在 VS 2012、.Net 4.5 和 VS 2010、.Net 4.0 上遇到了這個問題。我認為,它與軟體配置(VS?)有關,但我不知道哪個軟體和哪個參數。一般來說,我的同事使用相同的環境沒有這樣的問題。

引用自:https://stackoverflow.com/questions/2977630