¿Cómo puedo devolver un código de estado HTTP personalizado desde un método WCF REST?
Pregunta
Si algo sale mal en una llamada REST WCF, como no se encuentra el recurso solicitado, ¿cómo puedo jugar con el código de respuesta HTTP (configurándolo en algo como HTTP 404, por ejemplo) en mi método OperationContract?
Solución
Hay un WebOperationContext
al que puede acceder y tiene un OutgoingResponse
propiedad de tipo OutgoingWebResponseContext
que tiene un StatusCode
propiedad que se puede configurar.
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
Otros consejos
Si necesita devolver un cuerpo de razón, eche un vistazo a WebFaultException
Por ejemplo
throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
Para 404 hay un método integrado en WebOperationContext.Current.OutgoingResponse llamado SetStatusAsNotFound (mensaje de cadena) que establecerá el código de estado en 404 y una descripción de estado con una llamada
Tenga en cuenta que también existe, SetStatusAsCreated (ubicación de Uri) que establecerá el código de estado en 201 y el encabezado de ubicación con una sola llamada.
Si desea ver la descripción del estado en el encabezado, el método REST debe asegurarse de devolver un valor nulo de la sección Catch () como se muestra a continuación:
catch (ArgumentException ex)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
return null;
}
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
También puede devolver un código de estado y un cuerpo de razón con WebOperationContext 's StatusCode y Descripción del estado :
WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";
Esto no funcionó para mí para WCF Data Services. En su lugar, puede usar DataServiceException en el caso de Data Services. Encontré la siguiente publicación útil. http://social.msdn.microsoft .com / Forums / es / adodotnetdataservices / thread / f0cbab98-fcd7-4248-af81-5f74b019d8de