2009-11-12 20 views
5

Tengo un proyecto WCF de muestra que reproduce un problema que tengo con mi aplicación WCF real. Puede descargar el código fuente de mi aplicación WCF muestra hereEl objeto de comunicación no se puede usar para la comunicación porque ha sido cancelado

Accoding a los conjuntos de tiempos de espera en los archivos de código y configuración, no entiendo lo que está appening:

**** Server exception : System.ServiceModel.CommunicationObjectAbortedException: 

The communication object, System.ServiceModel.Security.SecuritySessionServerSettings+SecurityReplySessionChannel, cannot be used for communication because it 
has been Aborted. 

    at System.ServiceModel.Channels.CommunicationObject.ThrowIfClosedOrNotOpen() 
    at System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.SecureApplicationMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionServerSettings.SecuritySessionRequestContext.OnReply(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestContextBase.Reply(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestContextBase.Reply(Message message) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Reply(MessageRpc& rpc) 

**** client exception : : System.ServiceModel.Security.MessageSecurityException: An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail. ---> System.ServiceModel.FaultException: The message could not be processed. This is most likely because the action 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT/Cancel' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding. 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.ProcessRequestContext(RequestContext requestContext, TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.ReceiveInternal(TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.CloseOutputSession(TimeSpan timeout) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.CloseSession(TimeSpan timeout, Boolean& wasAborted) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ClientBase`1.Close() 
    at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose() 
    at WindowsFormsApplication1.Program.Main() in C:\Users\sdoucet\Documents\Visual Studio 2008\Projects\TestWCFLongExecution\WindowsFormsApplication1\Program.cs:line 25 

Respuesta

1

Parece que está de paso excepciones de vuelta al cliente. A WCF no le gustan las excepciones regulares, quiere errores o una excepción de falla en caso de errores. Después de que se ha devuelto una excepción, el canal está en estado de falla y no se puede volver a utilizar. Después de una FaultException, el canal aún se puede usar.

+0

Tiene razón, pero la excepción no la arroja mi código. Es lanzado por la infraestructura de WCF. No quiero saber por qué se lanza esta excepción y cómo evitarla. Sé que mi servicio se está ejecutando durante 10 minutos, pero de acuerdo con los tiempos de espera establecidos, no entiendo la excepción. – Sebastien

+2

Lo primero que debe hacer es habilitar el seguimiento completo en el servicio. Esto a menudo le dará mucha información sobre cuál es el problema original. – Maurice

6

Tuvimos un problema similar porque el grupo de aplicaciones que aloja el servicio se configuró para tener Procesos máximos de trabajo mayores que 1. Para que una llamada Abortar o Cerrar tenga éxito, debe enrutarse a la misma instancia de servicio que manejó el solicitud original

+1

Gracias por publicar esto, tuve exactamente el mismo problema en el entorno de organización de nuestros clientes. Uno de sus desarrolladores había establecido los 'Procesos máximos de trabajo' en 5, lo que causaba estas excepciones. Estábamos usando wsfederationhttpbinding y también teníamos un Servicio de token de seguridad (STS), haciendo la excepción que estaba volviendo aún más confuso, sugiriendo que el token no era válido. De hecho, la solicitud en ocasiones se dirigía al proceso de trabajo incorrecto. –

+0

Observamos el mismo problema y estábamos usando wshttpbinding con seguridad de mensajes. Tener equilibradores de carga Netscalar frente a las máquinas de servicio web hizo que el triaje fuera aún más difícil. Inicialmente pensamos que el LB no estaba manteniendo sesiones adhesivas, y tratamos de ver si sacar el LB de la igualdad resolvería el problema. Pero no fue así y eso es cuando notamos que la configuración de Procesos máximos de trabajo se estableció en más de 1. –

2

Tuve un problema similar al realizar una llamada asíncrona al servicio wcf. Después de recibir el resultado en el método async_completed obtuve una excepción.

"Se produjo una excepción durante la operación, por lo que el resultado no válido Compruebe InnerException de excepción".

InnerException:
"El objeto de comunicación no puede ser utilizado para la comunicación, ya que ha sido abortado"

Después de un gran esfuerzo, encuentro la solución, solo atrape la excepción sin agregar el método async_completed. (es decir, implementado el try/catch). No entendí cuál es el problema exacto, pero de alguna manera el canal de comunicación se está rompiendo.

Probé la approch arriba del siguiente enlace

http://geekswithblogs.net/SoftwareDoneRight/archive/2008/05/23/clean-up-wcf-clients--the-right-way.aspx

Todavía no estoy seguro de que este es el enfoque correcto, pero según mi escenario con el resultado de la operación no estoy haciendo nada furtherly. Por lo tanto, es una excepción y detiene el servicio.

Cuestiones relacionadas