2010-06-04 10 views
11

Ho un ServiceHost funzionante con un singolo NetTcpBinding e un singolo endpoint.WCF "Esistenza già esistente in CounterSet" Errore durante la riapertura di ServiceHost

I .Close() it. Quindi, creo una nuova istanza ServiceHost con la stessa configurazione esatta della prima. Poi, quando cerco di .Open() la nuova istanza sto ottenendo questa eccezione molto imbarazzante:

System.ArgumentException occurred 
    Message=Instance '[email protected]:||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) 

Qualcuno ha visto che prima? È un bug in .NET Framework (sto usando 4.0, tra l'altro)?

Probabilmente rilevanti informazioni circa il mio ServiceHost:

  • Nessun client sono connessi al padrone di casa, quando è prima chiuso;
  • Una personalizzazione IInstanceProvider viene utilizzata per creare istanze;
  • Il binding ReliableSession è attivato;
  • Il tipo di servizio è contrassegnato con ServiceBehavior di seguito;

.

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

Sono aperto a rivelare eventuali informazioni aggiuntive che potreste voler sapere sull'applicazione.

Aggiornamento 1 Ho compilato l'applicazione con il protocollo .NET 3.5 e l'errore NON è successo. Sfortunatamente, devo disattivare tutto ciò che si è basato su Task.

Aggiornamento 2 Ho registrato uno bug at Microsoft Connect su questo problema. Immagino che questa domanda abbia già una risposta ora.

+0

È possibile fornire informazioni complete sulla traccia di stack? –

+0

Lo stacktrace è vuoto in 'Exception' – jpbochi

risposta

7

Questo è un bug con .NET Framework 4.0. Ho registrato un bug at Microsoft Connect a riguardo.

Ecco la risposta di Microsoft:

Questo appare come un problema noto causato cronometrando le questioni in stretta prossimità/open sequenza di ServiceHost. ServiceHost mantiene alcuni contatori delle prestazioni che potrebbero non ottenere i dati raccolti che portano a questa eccezione. Presumo che si utilizza. Net Framework 4.0? prega di cercare di aggirare facendo una GC forzata prima di aprire il secondo ServiceHost:

GC.Collect() 
GC.WaitForPendingFinalizers() 

facendo quello che ha consigliato risolto il problema. Spero che venga risolto in una versione successiva.

+0

Oppure è tornato indietro. :(Sto ottenendo questo dall'ultimo aggiornamento da MS per gli hotfix di sicurezza.L'unica differenza che vedo nel mio codice è che sto usando un endpoint UDP, invece di un endpoint TCP.Aggiungere la soluzione al GC non ha risolto il problema. Vedrò cosa riesco a trovare su MS –

+1

Per me questa soluzione ha risolto il problema. Grazie! – Ikaso

4

Questo problema non ha alcuna relazione con il servizio WCF stesso, ma con System.ServiceModel.Diagnostics, che consente di monitorare il servizio in base ai contatori delle prestazioni. Crea un contatore per ciascun host del servizio e genera il nome per i parametri ServiceHost. E, se l'host con gli stessi parametri esiste già, causerà questa eccezione. See Microsoft sources here (è stato trovato dal GUID). E 'facile aviod: basta disattivare i contatori delle prestazioni per i servizi:

  1. Con app.config (testati)

    <configuration> 
        <system.serviceModel> 
         <diagnostics performanceCounters="Off" /> 
        </system.serviceModel> 
    </configuration> 
    
  2. In fase di esecuzione (non testato)

    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 Ho riscontrato questo problema su VS 2012, .Net 4.5 e VS 2010, .Net 4.0. Penso che sia legato alla configurazione del software (VS?), Ma non ho idea di quale software e di quale parametro. I miei colleghi non hanno questo problema ad usare, in generale, lo stesso ambiente.

Problemi correlati