¿Cómo puedo devolver un código de estado HTTP personalizado desde un método WCF REST?

Si algo falla en una llamada WCF REST, como que no se encuentra el recurso solicitado, ¿cómo puedo jugar con el código de respuesta HTTP (por ejemplo, configurándolo en HTTP 404) en mi método OperationContract?

Existe un WebOperationContext que puede acceder y tiene una propiedad OutgoingResponse de tipo OutgoingWebResponseContext que tiene una propiedad StatusCode que se puede establecer.

 WebOperationContext ctx = WebOperationContext.Current; ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; 

Si necesita devolver un cuerpo de razón, eche un vistazo a WebFaultException

Por ejemplo

 throw new WebFaultException("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 hay SetStatusAsCreated (ubicación de Uri) que configurará 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 nulo desde 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()); 

ref: https://social.msdn.microsoft.com/Forums/en-US/f6671de3-34ce-4b70-9a77-39ecf5d1b9c3/weboperationcontext-http-statuses-and-exceptions?forum=wcf

Esto no funcionó para mí para WCF Data Services. En cambio, puede usar DataServiceException en el caso de los servicios de datos. Encontré la siguiente publicación útil. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de

También puede devolver un código de estado y cuerpo de razón con StatusCode y StatusDescription de WebOperationContext :

 WebOperationContext context = WebOperationContext.Current; context.OutgoingResponse.StatusCode = HttpStatusCode.OK; context.OutgoingResponse.StatusDescription = "Your Message";