2008-09-26 158 views
75

如果在WCF REST调用中出现问题(如找不到请求的资源),我如何在我的OperationContract方法中使用HTTP响应代码(例如,将其设置为类似HTTP 404的方式)?如何从WCF REST方法返回自定义HTTP状态码?

+0

确定所有的答案,这个假设控制使它成为你的服务实现。如果他们通过一些完全无效的uri会怎么样?你认为如何为你的服务提供所有意想不到的点击404? – 2012-07-18 22:56:56

回答

96

有一个WebOperationContext,您可以访问,它有一个OutgoingResponseOutgoingWebResponseContext类型的属性,它具有可以设置的StatusCode属性。

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

这是否在WCF数据服务 - 服务操作中工作?我没有运气,似乎我设置的StatusCode被别的东西占据了先机。因此,在所有HTTP POST请求中,无论我将其设置为201等,我都会返回204。 – RyBolt 2010-12-22 15:32:52

+1

在我的情况下不起作用,状态被覆盖。然而,抛出一个`WebFaultException`确实有效。 – 2014-02-04 23:21:07

23

对于404有一个内置在方法上WebOperationContext.Current.OutgoingResponse称为SetStatusAsNotFound(字符串消息),将设置状态码404,并用一个呼叫的状态的说明。

请注意,还有,SetStatusAsCreated(Uri位置)将设置状态代码为201和位置标头与一次调用。

+0

比接受的答案中显示的方法优先吗? – crush 2014-10-09 15:33:42

58

如果需要退货的理由身体,然后看看WebFaultException

例如

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

我喜欢这比接受的更好,因为我们没有使用静态的WebOperationContext.Current – 2011-12-06 20:43:41

+0

请记住,这是唯一有效的,因为famework 4 http://msdn.microsoft.com/en-us/library/dd989924.aspx – sebagomez 2012-05-16 18:10:53

2

如果您希望看到标题中的状态描述,REST方法应该确保返回从Catch()部分中删除,如下所示:

catch (ArgumentException ex) 
{ 
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError; 
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message; 
    return null; 
} 
相关问题