2008-09-26 15 views
75

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?¿Cómo puedo devolver un código de estado HTTP personalizado desde un método WCF REST?

+0

bien todas las respuestas a este control asumir lo hizo en su implementación del servicio. ¿Qué pasa si pasan algún uri totalmente inválido? ¿cómo se supone que debe proporcionar un 404 para todos los éxitos inesperados en su servicio? –

Respuesta

96

Hay una WebOperationContext que se puede acceder y tiene una propiedad de tipo OutgoingResponseOutgoingWebResponseContext que tiene una propiedad StatusCode que se puede ajustar.

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

¿Funciona esto dentro de WCF Data Services - Service Operations? No he tenido suerte, parece que StatusCode I set es superado por otra cosa. Entonces, en todas las solicitudes HTTP POST, obtengo 204 independientemente de que lo configuré en 201, etc. – RyBolt

+1

No funciona en mi caso, el estado se sobrescribe. Sin embargo, lanzar una 'WebFaultException' parece funcionar. –

23

Por 404 hay una construida en el método de la WebOperationContext.Current.OutgoingResponse llamada SetStatusAsNotFound (mensaje de cadena) que establecerá el código de estado de 404 y una descripción de estado con una sola llamada.

Tenga en cuenta que también hay SetStatusAsCreated (ubicación de Uri) que establecerá el código de estado en 201 y el encabezado de ubicación con una llamada.

+0

¿Se prefiere esto al método mostrado en la respuesta aceptada? – crush

58

Si necesita devolver un cuerpo razón entonces echar un vistazo a WebFaultException

Por ejemplo

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest); 
+2

Me gusta más que la aceptada, ya que no estamos usando el WebOperationContext.Current estático –

+0

tenga en cuenta que esto solo es válido desde famework 4 http://msdn.microsoft.com/en-us/library/dd989924.aspx – sebagomez

+0

hmm, en .NET 4.5.1 esto no está configurando el código de estado para mí, todavía obtengo un 200. Estoy usando jsonp, está llamando mi devolución de llamada (en javascript) y pasando mi mensaje y mi código de estado como un entero. – Shavais

2

Si desea ver la descripción de estado en la cabecera, el método resto debe asegurarse de volver null 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; 
} 
+1

Esto tampoco funcionó para mí, todavía obtengo un 200. Estoy usando WebHttpBinding con crossDomainScriptAccessEnabled = "true" y un comportamiento de punto final de webHttp con un estilo de cuerpo predeterminado de wrap y un formato de respuesta saliente predeterminado de json. .pero eso no debería importar, ¿o sí? – Shavais

Cuestiones relacionadas