2010-08-24 38 views
7

Tengo muchos servicios web ejecutándose en mi proyecto, pero algo extraño ha estado ocurriendo durante bastante tiempo. Mis servicios se cuelgan ocasionalmente sin motivo alguno con un mensaje de error "El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no se puede utilizar para la comunicación porque está en estado Faulted". Esto generalmente ocurre cuando ejecuto la aplicación a primera hora de la mañana, después de lo cual ocurren con menos frecuencia. ¿Alguna idea sobre qué podría estar causando este error?WCF at Services estado fallido

+0

¿Has probado el trazado de WCF? –

+0

¿Este error proviene del código que consume un servicio WCF, o del propio servicio? –

+0

@Ladislav: No, todavía no. No estoy seguro del trazado de WCF. ¿Son buenos tutoriales para que me apunten? @ Graham: Esto proviene básicamente del código que consume el servicio WCF – Farax

Respuesta

5

Esto suena como un tiempo de espera combinado con no manejar los servicios defectuosos.

Tarda más en ejecutarse por la mañana ya que el código debe compilarse JIT, tal vez también la base de datos necesita almacenar en caché los datos y los planes de consulta.

Aquí es una manera de conseguir que el cliente WCF para limpiar después de sí mismo http://nimtug.org/blogs/damien-mcgivern/archive/2009/05/26/wcf-communicationobjectfaultedexception-quot-cannot-be-used-for-communication-because-it-is-in-the-faulted-state-quot-messagesecurityexception-quot-an-error-occurred-when-verifying-security-for-the-message-quot.aspx

+0

pero no estoy usando "usar "bloques. – Farax

+0

Todavía tiene que cerrar el servicio después de haberlo usado, y debe cancelar el servicio si está en estado de error –

+0

De hecho, después de quitar mi bloque de USO pude ver el error real. 10x –

9

Si un servicio WCF lanza una FaultException, el cliente tendrá su estado cambia a CommunicationState.Faulted. Si a continuación, intenta utilizar este objeto cliente para llamar a otra operación de servicio, obtendrá el error

"El objeto de comunicación, System.ServiceModel.Channels.ServiceChannel, no se puede utilizar para la comunicación, ya que está en estado de Falla ".

También puede obtener este error si intenta llamar al método Close() en un cliente con errores, no lo recuerdo.

Puede verificar el estado de su objeto cliente marcando la propiedad State. Si desea cerrar su cliente correctamente (lo cual debería estar haciendo), debe llamar al método Abort() si el cliente está en el estado Faulted y Close() si el cliente se encuentra en cualquier otro estado.

+0

Tipo de derrotar el propósito de 'usar', ¿no? WCF nunca deja de sorprenderme por lo mal diseñado que está. –

Cuestiones relacionadas