¿Cuál es la mejor manera de devolver errores de un servicio WCF de una manera RESTful?
-
03-07-2019 - |
Pregunta
Usar WCF de una manera RESTful parece genial. Soy & # 8217; soy un gran admirador de las grandes armas como la simplicidad y la flexibilidad, pero también me encanta la forma en que las Urls terminan viéndose. ¿Qué puedo decir? Yo & # 8217; soy programador.
La API simple para recuperar y editar recursos se corresponde con un conjunto casi igualmente simple de posibles respuestas de error, y no puedo & # 8217; no puedo evitar sentir que mantener un & # 8220; puro # 8221; Enfoque RESTANTE Puedo cortarme la nariz a pesar de cara, o más específicamente, la nariz de los consumidores de mi servicio web. Podría estar equivocado, pero no hay & # 8217; parece que hay muchos códigos de error Http que puedo usar, y no hay formas de devolver un mensaje de error personalizado.
Para aclarar, estoy hablando de errores excepcionales adecuados y errores no esperados. Quiero comunicar un problema al usuario para ayudarlo a identificar lo que necesita hacer para corregirlo.
Posibles opciones que estoy considerando ...
Simplemente use los códigos de error Http & # 8211; Parece que sería demasiado restrictivo en lo que soy capaz de expresar, y no ganará & # 8217; no me permite enviar un mensaje personalizado. Por favor (!) Corrígeme si me equivoco.
Siempre devuelve Http Success pero devuelve objetos de error personalizados & # 8211; Obviamente el más flexible pero ciertamente no el más RESTANTE.
Realmente agradecería que alguien pudiera compartir alguna experiencia del mundo real de este problema en particular.
Actualizar
Gracias por la sugerencia de usar la propiedad StatusDescription
del objeto OutgoingWebResponseContext
. Al principio parecía ser algo que podía usar.
He llegado a la conclusión de que mi segunda opción anterior no es para mí. Quiero apegarme a lo que Http me puede dar.
Sin embargo, tengo problemas para que funcione. Independientemente del valor que proporcione para esta propiedad, no & # 8217; se devuelve en la respuesta.
Mi método de servicio se ve así
public MyType GetMyTypes(string criteria)
{
try
{
return GetMyTypes();
}
catch (Exception ex)
{
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Forbidden;
response.StatusDescription = "A Big fat error occurred";
return null;
}
}
Y aquí está el mensaje de respuesta sin procesar. No se menciona el mensaje personalizado ...
HTTP / 1.1 403 Prohibido
Servidor: Servidor de desarrollo ASP.NET / 9.0.0.0
Fecha: miércoles, 07 de enero de 2009 14:01:20 GMT
Versión X-AspNet: 2.0.50727
Control de caché: privado
Longitud del contenido: 0
Conexión: Cerrar
No es que solo necesite acceder a la propiedad correcta en el cliente. La información simplemente no se envía a través del enlace.
¿Qué hace realmente esta <=> propiedad?
Actualizar
Nunca descubrí cómo configurar la propiedad StatusDescription. Terminé sin incluir ningún mensaje de error, y seguí únicamente con los códigos de estado Http. He optado por exponer los puntos finales Soap y Restful para mis servicios, y así los clientes pueden elegir cuál prefieren usar & # 8211; los simples mensajes de Restful o los relativamente ricos mensajes de Soap.
Solución
Envíe el código de respuesta adecuado y puede proporcionar el mensaje de error personalizado en el cuerpo de la respuesta.
Otros consejos
Con .net 4, arroje un < code> WebFaultException < T > (T errorDetail,
HttpResponseCode
code)
Aquí establece su tipo de respuesta en otro tipo de objeto, lo cual tiene sentido, y también establece el ResponseCode
que desea.
El errorDetail
debe ser serializable
Agrego el código de error tanto como arriba (en la descripción del estado) como en el cuerpo de la página devuelta en mis servicios REST como:
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;
Ver este hilo para una pregunta similar.
En pocas palabras, creo que puede configurar el código de estado HTTP (a uno de los códigos de error) y proporcionar su mensaje personalizado en Propiedad StatusDescription :
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";
Desafortunadamente, no sé mucho sobre la prevalencia de esta técnica en el mundo real.
Esto puede ser un defecto. A partir del 22/09/2011, el equipo del producto está revisando el problema: