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 ...

  1. 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.

  2. 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.

¿Fue útil?

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

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

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:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top