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

C# 如何从WCF REST方法返回自定义HTTP状态代码?,c#,.net,wcf,rest,C#,.net,Wcf,Rest,如果WCF REST调用中出现错误,例如找不到请求的资源,我如何在OperationContract方法中使用HTTP响应代码(例如,将其设置为类似HTTP 404的代码)?有一个可以访问的属性,它有一个可设置的属性类型 WebOperationContext ctx = WebOperationContext.Current; ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; 对于404,在WebOperation

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

有一个可以访问的属性,它有一个可设置的属性类型

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

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


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

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

比如说

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
抛出新的WebFaultException(“条不是Foo'd”,HttpStatusCode.BadRequest);

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

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

这对我来说不适用于WCF数据服务。相反,对于数据服务,您可以使用DataServiceException。发现下面的帖子很有用。


ref:

您还可以返回状态代码和带有“和”的原因正文:


这在WCF数据服务-服务操作中起作用吗?我运气不好,似乎我设置的状态码被其他东西打败了。因此,在所有HTTP POST请求中,我返回204,不管我将其设置为201,等等。在我的情况下不起作用,状态被覆盖。但是,抛出一个
WebFaultException
似乎确实有效。我喜欢这个,因为我们没有使用静态WebOperationContext。请记住,这只在famework 4.5.1中有效,在.NET 4.5.1中,这不是为我设置状态代码,我仍然得到200分。我使用的是jsonp,它调用我的回调(javascript)并将我的消息和状态代码作为整数传递。这对于2XX代码之外的任何东西都很好,但是您是否会抛出一个
WebFaultException
来返回一个
HttpStatusCode.Created
?确定此假设控件的所有答案都已包含在您的服务实现中。如果他们传递了一些完全无效的uri呢?你怎么能为你服务的所有意外点击提供404呢?这对我来说也不管用,我仍然得到200分。我将WebHttpBinding与crossDomainScriptAccessEnabled=“true”一起使用,并使用webHttp的端点行为,默认主体样式为wrapped,默认传出响应格式为json。。但这不重要,不是吗?这对我也不起作用,我只是收到了一个400个错误的请求,没有其他有用的信息,也没有响应体。这比接受的答案中显示的方法更可取吗?
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";