Actualmente estamos teniendo un debate sobre si es mejor lanzar fallas sobre un canal WCF, versus pasar un mensaje que indique el estado o la respuesta de un servicio.WCF - Fallas/Excepciones versus Mensajes
Las fallas vienen con el soporte integrado de WCF donde puede usar los manejadores de error incorporados y reaccionar en consecuencia. Esto, sin embargo, conlleva gastos generales, ya que arrojar excepciones en .NET puede ser bastante costoso.
Los mensajes pueden contener la información necesaria para determinar qué sucedió con su llamada de servicio sin la sobrecarga de lanzar una excepción. Sin embargo, necesita varias líneas de código repetitivo para analizar el mensaje y determinar las acciones que siguen a su contenido.
Nos tomó una puñalada en la creación de un objeto de mensaje genérico que podríamos utilizar en nuestros servicios, y esto es lo que se nos ocurrió:
public class ReturnItemDTO<T>
{
[DataMember]
public bool Success { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public T Item { get; set; }
}
Si todas mis llamadas de servicio al volver este artículo, puedo comprobar constantemente la propiedad "Success" para determinar si todo salió bien. Luego tengo una cadena de mensaje de error en el evento que indica que algo salió mal, y un elemento genérico que contiene un Dto si es necesario.
La información de excepción se debe registrar en un servicio de registro central y no se debe volver a retransmitir desde el servicio.
¿Pensamientos? ¿Comentarios? Ideas? Sugerencias?
más aclaraciones sobre mi pregunta
Un problema que estoy teniendo con contratos de falla está comunicando reglas de negocio.
Me gusta, si alguien inicia sesión y su cuenta está bloqueada, ¿cómo la comunico? Su inicio de sesión obviamente falla, pero falla debido a la razón "Cuenta bloqueada".
yo también:
a) usar un valor lógico, tirar de fallos a cuenta de mensajes bloqueados
B) AuthenticatedDTO volver con información relevante
No estoy de acuerdo. Como se supone que WCF es independiente del idioma (de alguna forma, al menos) no puede garantizar que pasar un objeto Exception por el cable no cause problemas, p. Ej. Clientes de Java. El tipo de objeto FaultContract puede garantizar la interoperabilidad ya que es parte de las especificaciones OASIS. – ZombieSheep
.NET traduce las excepciones a los contratos de falla. Ver el enlace que agregué a mi respuesta. –
Siempre tuve la impresión de que lanzar una excepción conllevaba gastos indirectos innecesarios. De su publicación, parece que estuve tristemente equivocado. Antes de marcar esta publicación como la siguiente, quiero obtener más opiniones. Pero teniendo en cuenta su opinión, parece que la falta de contrato es la mejor opción – WebDude