WCF 4.0 - 使用 REST 服务模板返回 JSON WebFaultException
Posted
技术标签:
【中文标题】WCF 4.0 - 使用 REST 服务模板返回 JSON WebFaultException【英文标题】:WCF 4.0 - Returning JSON WebFaultException with REST Service Template 【发布时间】:2011-09-09 15:43:07 【问题描述】:我正在使用 WCF REST 服务模板 40(CS)。我这样抛出 WebFaultExceptions:
throw new WebFaultException<string>("Error Message", HttpStatusCode.BadRequest);
但是,当我用我的客户端对此进行测试时,所有内容都作为 500 的 Http 状态代码返回,并且响应是 XML。我可以在 XML 响应中看到错误消息。当我正确拨打电话时,我会收到 200 响应,并且响应采用 JSON 格式,考虑到我的配置和 ServiceContract 的设置方式,这是正确的。
我可以让错误请求的 HTTP 状态代码为 400 的唯一方法是这样做:
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.BadRequest;
我仍然无法让异常返回为 JSON。
编辑添加签名以获取更多信息:
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, UriTemplate = "myendpoint")]
有没有简单的方法可以做到这一点?
【问题讨论】:
如果这工作正常,状态码应该是 400(错误请求)。您能否启用跟踪以查看是否有其他原因阻止 WebFaultExceptioncatch(WebFaultException<string> ex) throw;
吗?如果需要,我还可以添加其他配置信息。
这应该不是问题;能否贴出操作合约的签名(带有[WebGet/WebInvoke]属性)?
我添加了我的方法签名。它们都是 POST 并且具有类似的设置。
【参考方案1】:
在您的 web.config 中,将 AutomaticFormatSelectionEnabled 的值设置为 false
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" />
将响应格式设置为 json(您已经这样做了)
[WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json)]
【讨论】:
【参考方案2】:当WebHttpBehavior.FaultExceptionEnabled
设置为true
时,WebFaultException
将产生一个 200 响应,并将错误呈现为 XML 而不是 JSON,尽管有 automaticFormatSelectionEnabled
配置设置或响应格式属性设置。 MSDN 文档没有提及这一点,并且具有误导性,因为它声明此属性仅与 500 响应代码相关。
【讨论】:
将WebHttpBehavior.FaultExceptionEnabled
设置为false
对我有帮助。否则,我总是会在每次抛出 WebFaultException
时得到 500 响应代码。【参考方案3】:
对于那些仍然有这个问题的人。这对我有用
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
throw new System.ServiceModel.Web.WebFaultException<Response>(
new Response(false,"was not found", ""),System.Net.HttpStatusCode.BadRequest);
【讨论】:
什么是Response
?以上是关于WCF 4.0 - 使用 REST 服务模板返回 JSON WebFaultException的主要内容,如果未能解决你的问题,请参考以下文章