2010-06-04 26 views
11

Tengo un ServiceHost activo con un solo NetTcpBinding y un punto final único.WCF "La instancia ya existe en CounterSet" al volver a abrir ServiceHost

I .Close() it. Luego, creo una nueva instancia de ServiceHost con la misma configuración exacta que la primera. Entonces, cuando trato de .Open() la nueva instancia que estoy recibiendo esta muy incómoda excepción:

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) 

nadie ha visto antes? ¿Es un error en .NET Framework (estoy usando 4.0, por cierto)?

información relevante sobre Probablemente mi ServiceHost:

  • No hay clientes están conectados al sistema principal, cuando por primera vez se cierra;
  • Se usa un IInstanceProvider personalizado para crear instancias;
  • La encuadernación ReliableSession está activada;
  • El tipo de servicio está marcado con el ServiceBehavior a continuación;

.

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

Estoy abierto a revelar cualquier información adicional que pueda interesarle sobre la aplicación.

Actualización 1 Recopilé la aplicación dirigida a .NET 3.5 y el error NO ocurrió. Desafortunadamente, tengo que desactivar todo lo que se haya basado en Task.

Actualización 2 He registrado un bug at Microsoft Connect sobre este tema. Supongo que esta pregunta ya está respondida ahora.

+0

¿Puede proporcionar una información completa de seguimiento de la pila? –

+0

La stacktrace está vacía en la 'Excepción' – jpbochi

Respuesta

7

Este es un error con .NET Framework 4.0. Logré un bug at Microsoft Connect al respecto.

Aquí está la respuesta de Microsoft:

Esto parece un problema conocido causado por problemas de tiempo en apretada Cerrar/ secuencia de apertura de ServiceHost. ServiceHost mantiene algunos contadores de rendimiento que pueden no obtener la basura recogida dando lugar a esta excepción. Supongo que está utilizando .Net Framework 4.0? favor intente solucionar haciendo un GC forzada antes de abrir la segunda ServiceHost:

GC.Collect() 
GC.WaitForPendingFinalizers() 

Hacer lo aconsejaron resolvieron el problema. Espero que se solucione en un lanzamiento posterior.

+0

O regresó. :(Estoy obteniendo esto desde la última Actualización de MS para Security HotFixes. La única diferencia que veo en mi código es que estoy usando un punto final UDP, en lugar de un punto final TCP. Agregar la solución del GC no resolvió el problema. Veré lo que puedo encontrar en MS –

+1

Para mí, esta solución solucionó el problema. ¡Gracias! – Ikaso

4

Este problema no tiene relación con el servicio WCF en sí mismo, sino con System.ServiceModel.Diagnostics, que permite supervisar el servicio por los contadores de rendimiento. Crea un contador establecido para cada host de servicio y genera un nombre para establecerlo mediante los parámetros de ServiceHost. Y, si el host con los mismos parámetros ya existe, causará esta excepción. See Microsoft sources here (fue encontrado por GUID). Es fácil Es necesario comunicar que: sólo tiene que desactivar los contadores de rendimiento para los servicios de:

  1. Por app.config (probado)

    <configuration> 
        <system.serviceModel> 
         <diagnostics performanceCounters="Off" /> 
        </system.serviceModel> 
    </configuration> 
    
  2. En tiempo de ejecución (no probado)

    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 Tengo este problema en VS 2012, .Net 4.5 y VS 2010, .Net 4.0. Creo que está relacionado con la configuración del software (VS?), Pero no tengo idea de qué software ni a qué parámetro. Mis compañeros de trabajo no tienen ese problema al usar, en general, el mismo entorno.

Cuestiones relacionadas