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


88

如果WCF REST调用中出现问题,例如找不到请求的资源,我该如何在OperationContract方法中使用HTTP响应代码(例如,将其设置为HTTP 404之类的东西)?


好的,所有关于此假定的答案都假定控制已将其纳入您的服务实现中。如果他们通过了一些完全无效的uri怎么办?您如何为所有意外的服务命中提供404?
Nathan Tregillus 2012年

Answers:


111

有一个WebOperationContext您可以访问的OutgoingResponse属性,并且它具有一个类型可以设置OutgoingWebResponseContextStatusCode属性。

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

5
这在WCF数据服务-服务运营内部起作用吗?我还没有走运,似乎我设置的StatusCode被其他东西压倒了。因此,在所有HTTP POST请求上,无论将其设置为201等,我都会返回204。
RyBolt 2010年

1
在我的情况下不起作用,状态将被覆盖。WebFaultException但是,抛出a 似乎确实有效。
Josh M.

73

如果需要返回原因正文,请查看WebFaultException

例如

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

4
我比接受的更好,因为我们没有使用静态的WebOperationContext.Current
Noel Abrahams

记住,这只是因为famework 4有效msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

嗯,在.NET 4.5.1中,这并没有为我设置状态代码,我仍然得到200。整数。
沙威

4
这对于2XX代码以外的任何内容似乎都很棒,但是您会抛出a WebFaultException来返回HttpStatusCode.Created吗?
暗恋

23

对于404,在WebOperationContext.Current.OutgoingResponse上有一个内置方法,称为SetStatusAsNotFound(字符串消息),该方法将状态代码设置为404,并通过一次调用将状态描述设置为404。

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


这比接受的答案中显示的方法更可取吗?
暗恋

2

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

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

1
这也对我不起作用,我仍然得到200。但这没关系,对吗?
沙威2014年

2

您还可以使用WebOperationContextStatusCodeStatusDescription返回状态码和原因正文:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.