如何从WCF REST方法返回自定义HTTP状态码?

92

如果WCF REST调用出现问题,例如请求的资源未找到,我应该如何在我的OperationContract方法中操作HTTP响应代码(将其设置为类似于HTTP 404的内容)?


好的,所有的答案都假设控制权已经转移到了您的服务实现。如果他们传递一些完全无效的URI,该怎么办?您应该如何为所有意外命中您的服务提供404响应? - Nathan Tregillus
7个回答

121

5
这个能在 WCF 数据服务 - 服务操作 中使用吗?我尝试过但没有成功,似乎我设置的 StatusCode 被其他东西覆盖了。因此,在所有的 HTTP POST 请求中,无论我将它设置为 201 等,我都会收到 204 的返回。请问这段代码是否可行? - RyBolt
1
在我的情况下无法工作,状态被覆盖。然而,抛出 WebFaultException 似乎有效。 - Josh M.

78
如果您需要返回一个原因主体,则可以查看WebFaultException
例如:
throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );

4
我喜欢这个版本胜过已接受的那个,因为我们没有使用静态的WebOperationContext.Current。 - Zephyr was a Friend of Mine
请注意,此内容仅适用于框架4及以上版本。http://msdn.microsoft.com/en-us/library/dd989924.aspx - sebagomez
1
嗯,在.NET 4.5.1中,这对我没有设置状态代码,我仍然得到了200。我正在使用jsonp,它调用我的回调(在javascript中)并将我的消息和我的状态代码作为整数传递。 - Shavais
7
除了 2XX 状态码以外,这似乎对任何其他情况都很好用。但是如果要返回 HttpStatusCode.Created,您会抛出 WebFaultException 吗? - crush

25

对于404错误,WebOperationContext.Current.OutgoingResponse内置了一个名为SetStatusAsNotFound(string message)的方法,它可以一次调用设置状态码为404并设置状态描述。

注意,还有一个名为SetStatusAsCreated(Uri location)的方法,它可以一次调用将状态码设置为201并设置位置头。


这种方法是否比被接受的答案中展示的方法更好? - crush

6
你可以使用WebOperationContextStatusCodeStatusDescription返回状态码和原因。
WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";

3
如果您希望在标题中查看状态说明,则REST方法应确保从以下Catch()部分返回null:
catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
这对我也没用,我仍然得到了200。我正在使用crossDomainScriptAccessEnabled="true"的WebHttpBinding,并且具有webHttp的端点行为,默认的body样式为wrapped,默认的输出响应格式为json...但这不应该有影响,对吧? - Shavais

1

0

这对我也不起作用,我只得到一个400错误请求,没有其他有用的信息,也没有响应体。 - Shavais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接