Tengo un gran número de código heredado que ahora es un backend para un servicio WCF REST, que solía ser un backend WCF habitual antes, si eso fuera importante. Quiero implementar un mecanismo que atrape cualquier excepción en cualquier método y lo analice. Si resulta ser un error conocido, se procesará y se convertirá en un error de aspecto amistoso.Servicios de WCF REST: gestión de excepciones genéricas
Sé que puedo lanzar FaultException
o WebProtocolException
en lugar de las excepciones 'habituales', pero hay muchos lugares donde se lanzan excepciones en todo el código, y buscar todos ellos es una opción bastante dolorosa.
Intenté agregar una extensión de comportamiento de punto final que crea un nuevo comportamiento que anula el método WebHttpBehavior.AddServerErrorHandlers
estándar y agrega mis controladores de errores (implementaciones IErrorHandler
) a la colección de controladores de error del asignador de extremo. Dentro de los manejadores de errores analizo la excepción y creo (o no creo) un fallo basado en esta excepción.
Esperaba que este mecanismo devolviera datos personalizados para cualquier excepción conocida, pero estaba equivocado. El bueno de Microsoft ha implementado un maravilloso e inevitable WebHttpBehavior2
, que agrega incondicionalmente un Microsoft.ServiceModel.Web.WebErrorHandler
interno al final de la colección de manejadores de errores del asignador de punto final. Este manejador ignora todos los manejadores previamente ejecutados y reconoce solo un pequeño conjunto de excepciones, mientras que la mayoría se interpreta como "Error interno del servidor", y nada más.
La pregunta es si estoy en el camino correcto y hay una forma de deshabilitar este controlador en el mecanismo WCF REST, o introducirlo con una nueva excepción (por ejemplo, cuando se detecta cualquier excepción, primero es procesada por mi controladores y si lanzan/devuelven, por ejemplo, FaultException, esta nueva excepción se suministra al Microsoft.ServiceModel.Web.WebErrorHandler
en lugar del original). Si todos mis experimentos con IErrorHandler
y las extensiones de comportamiento no tienen valor, ¿cuál es una alternativa? De nuevo, realmente no quiero modificar la lógica de arrojar excepciones, quiero que un lugar capte las excepciones y las procese.
¡Muchas gracias!
Tal captura debería agregarse a cada método de servicio, ¿verdad? ¿O hay una manera de escribirlo en alguna parte una sola vez para manejar todas las excepciones? Me gustó el enfoque basado en el comportamiento porque definía un controlador común para todas las excepciones, y no tenía que preocuparme por manejar y procesar excepciones para cada método. Lo mejor es que definí un procesador para todos los servicios en el punto final. No puedo lograr esto usando su enfoque, ¿verdad? –
Establecer el 'StatusDescription' no tiene ningún efecto! La respuesta siempre tiene una descripción de estado genérica. ¿Hay alguna manera de arreglarlo? – Hemant
Tiene.Puede verificarlo en el mensaje saliente del servidor que usa el violín, .... Pero lo que tiende a encontrar es que varios navegadores o implementaciones diferentes pueden ignorar la descripción y simplemente usar el código para mapear a un mensaje predefinido. Tuve ese problema con una aplicación de Android que estaba creando y terminé configurando la descripción y cambiando la firma del método para poder devolver una cadena. ¡Ay! ** Es por eso que nunca volvería a utilizar WCF REST. ** – Aliostad