wcf session

wcf - Falla de sesión confiable por razón desconocida



session (1)

Estoy intentando lograr lo siguiente: una instancia de proxy del lado del cliente (abierta) a la que acceden varios subprocesos mediante una sesión confiable . Lo que he logrado hasta ahora es tener A) una sesión confiable con un proxy del lado del cliente que se crea y elimina por llamada o B) a lo que aspiro, pero sin una sesión confiable.

Sin embargo, cuando habilito sesiones confiables en mi enlace, se muestra el siguiente comportamiento:

Lado del cliente

Al iniciar la aplicación, todo parece funcionar bien hasta aproximadamente 18 mensajes en la sesión de WCF. Primero obtengo el evento proxy.InnerChannel.Faulted generado, luego se proxy.InnerChannel.Faulted una excepción en el punto en el que llamo al método en el proxy. La excepción es una excepción System.TimeoutException , con el mensaje:

"El canal de solicitud agotó el tiempo de espera mientras esperaba una respuesta después de las 00: 00: 59.9062512. Aumente el valor del tiempo de espera pasado a la llamada a Solicitar o aumente el valor de SendTimeout en el enlace. El tiempo asignado a esta operación puede haber sido una parte de un tiempo de espera más largo ".

La excepción interna tiene un mensaje similar:

"La operación de solicitud no se completó dentro del tiempo de espera asignado de 00:01:00. El tiempo asignado a esta operación puede haber sido una parte de un tiempo de espera más largo".

Con el método en la parte superior del rastro de la pila interna es:

System.ServiceModel.Channels.ReliableRequestSessionChannel.SyncRequest.WaitForReply(TimeSpan timeout)

Luego llamo a proxy.Close seguido de proxy.Abort (captura e ignora las excepciones). Si utilizo la configuración predeterminada (es decir, simplemente tengo <reliableSession/> ), entonces llame al proxy. El cierre da como resultado otra excepción de System.Timeout (aunque esta vez el tiempo de espera asignado es 00:00:00), sin embargo, si anulo los valores predeterminados como se especificó anteriormente, no se produce ninguna excepción.

Lado del servicio

Utilizando el rastreo de WCF obtengo una System.ServiceModel.CommunicationException , con el mensaje:

"La secuencia ha sido terminada por el punto final remoto. La sesión ha dejado de esperar una respuesta en particular. Debido a esto, la sesión confiable no puede continuar. La sesión confiable tuvo un error".

Y una traza de pila que termina en:

System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)

Cuando me conecto de forma remota al servidor, recibo el mismo mensaje, que aparece cuando la ejecución del código pasa por encima de la declaración de retorno de mi servicio en la llamada de servicio que causa el error.

Lo desconcertante para mí es que el servicio es estable y se ejecuta con las opciones A) o B) como se describe al comienzo de mi publicación, y ocurre después de un número variable de mensajes (alrededor de 18). El hecho anterior indica que no hay nada de malo en el código (de hecho, he comprobado que no se producen excepciones), y el segundo solo sirve para confundirme y es por eso que modifiqué la configuración en el enlace de sesión confiable.

Estoy bastante atascado en esto. ¿Alguien puede sugerir por qué la sesión confiable podría fallar de esa manera?


Debe anular el valor predeterminado, y establecer su tiempo de espera más alto o más bajo depende de la causa, parece que el tiempo de espera está causando una excepción justo después de que algún otro programa haya comenzado o se haya detenido solo un milisegundo antes de la excepción

O la causa más probable

sus tiempos de espera asignados pueden agregarse como un tiempo de espera único continuo de 18 minutos o 18 llamadas. Además, otros tiempos de uso se suman como un tiempo de espera completo. Esto puede ser la razón por la que se solicita más tiempo.

En cualquier caso, tiene que establecer su propia configuración de forma estática porque la configuración automática predeterminada siempre superará cualquier cambio que realice.

escriba el nombre de enlace http de su host local y establezca su closetimeout en aproximadamente 5,00 min e incluso cambie el tiempo de solicitud también. Tiempo de solicitud 2.00 min.

closeTimeout = "00:05:00"