Tenemos un servicio WCF que estamos consumiendo desde una aplicación web. El cliente que estamos utilizando se generó utilizando la opción "Agregar referencia de servicio" de Visual Studio. Dado que es una aplicación web, y dado que la naturaleza de la aplicación es probable que conduzca a sesiones relativamente cortas, hemos optado por crear una instancia del cliente cuando un usuario inicia sesión y lo mantiene durante toda la sesión, luego maneje su eliminación cuando la sesión haya terminado.Manejar al cliente WCF persistente ingresando el estado fallado
Esto me lleva a mi pregunta: estamos tratando de decidir la mejor manera de manejar el canal del cliente entrando en un estado Faulted. Después de buscar en torno a algunos, que hemos llegado con esto:
if(client.State = CommuncationState.Faulted)
{
client = new Client();
}
try
{
client.SomeMethod();
}
catch //specific exceptions left out for brevity
{
//logging or whatever we decide to do
throw;
}
Esto, sin embargo, no funciona debido al hecho de que, al menos en nuestro caso, incluso si el servicio se ha reducido el cliente mostrará el Open
estado hasta que realmente intenta hacer una llamada que lo usa, en ese momento entra en el estado Faulted
.
Esto nos deja para hacer otra cosa. Otra opción que se nos ocurrió fue:
try
{
client.SomeMethod();
}
catch
{
if(client.State == CommunicationState.Faulted)
{
//we know we're faulted, try it again
client = new Client();
try
{
client.SomeMethod();
}
catch
{
throw;
}
}
//handle other exceptions
}
Pero eso huele mal. Obviamente, podríamos evitar esto usando un nuevo cliente y disponiéndolo para cada llamada. Parece innecesario, pero si es el camino correcto, entonces supongo que eso es lo que optaremos. Entonces, ¿cuál es la mejor manera de manejar con elegancia si el cliente está en un estado de falla y luego hacer algo al respecto? ¿De verdad deberíamos obtener un nuevo cliente para cada llamada?
Otra cosa a tener en cuenta: la creación de instancias del cliente y todas estas comprobaciones y gestiones se realizan en una clase contenedora para el cliente. Si hacemos esto de la forma en que lo intentamos, es transparente para la aplicación en sí misma: realizar llamadas y manejar excepciones de ellas no requiere ningún código especial allí.
¿Qué causa que el cliente entre en un estado con falla? Siempre he podido hacer que un servicio WCF devuelva un error normalmente y el cliente puede continuar con su negocio. ¿El servidor no responde o algo así? – Tridus
En este caso, estamos usando membresía ASP.NET, y nos encontramos con ella al exceder el atributo "userIsOnlineTimeWindow". Obviamente, en ese caso, tendría sentido redirigir al usuario a la página de inicio de sesión, pero estamos intentando asegurarnos de que estamos preparados para cualquier otra situación en la que podamos ponernos en estado de error. – Zannjaminderson