修改响应标头时,WCF Web 服务未返回正确的状态代码

Posted

技术标签:

【中文标题】修改响应标头时,WCF Web 服务未返回正确的状态代码【英文标题】:WCF webservice is not returning the correct status code when the response header is modified 【发布时间】:2012-05-16 00:22:24 【问题描述】:

我有一个非常简单的 WCF Web 服务,我使用 Ajax 在客户端调用它:

这是我的网络服务:

public string TestService() 
    throw new Exception();
    return "";

这是我的客户端 Ajax 调用的样子:

var mySuccess = function(result,statuscode,xhr)
    alert('success');


var myFail = function(result,statuscode,xhr)
    alert('failure');


$.ajax(
    type: 'Post'
    contentType: "application/json; charset=utf-8",
    url: '../myService.svc/TestService',
    data: '',
    dataType: "json",
    success: mySuccess,
    error: myFail
);

此 Web 服务每次都失败(应该如此!),返回状态和代码“500:内部服务器错误”。 'myFail' 回调函数被触发。

但是,如果我在 Web 服务中修改响应标头,如下所示:

public string TestService() 
    WebOperationContext.Current.OutgoingResponse.Headers.Add("token", "1");
    throw new Exception();
    return "";

那么每次返回的状态/代码都是“200:OK”!

这意味着每次都会触发“mySuccess”函数,即使 Web 服务应该失败也是如此。我不明白为什么简单地将我自己的自定义标头添加到响应中会以这种方式覆盖返回状态。

我有什么遗漏吗?

【问题讨论】:

我能够重现该行为。看起来像一个错误。 那就尴尬了。有没有其他方法可以将一些响应传递回客户端 - 这不涉及摆弄实际的返回值? 我不这么认为。客户端看到的只是实际的 HTTP 响应,它包含两部分:响应标头和正文。 就我个人而言,我认为这与您在设置后Cannot modify header information 的事实有关。在常规 ASP.NET 中,您只需缓冲响应。 我决定发送修改后的标头信息,接受我将丢失返回的任何错误代码。服务器异常总是返回一个定义明确的 JSON 异常字符串,我可以对其进行解析以查看服务调用是否失败。 【参考方案1】:

一个选项是抛出一个带有有意义的 HTTP 状态和消息的WebFaultException。 示例: throw new WebFaultException("Invalid request received.", HttpStatusCode.BadRequest);BadReuqest 代码为 400。

【讨论】:

以上是关于修改响应标头时,WCF Web 服务未返回正确的状态代码的主要内容,如果未能解决你的问题,请参考以下文章

CORS 尝试,php 未修改响应标头

如何从 WCF 服务返回 multipart/form-data 作为响应

从 PHP Web 服务未正确返回编码响应

WCF - 远程服务器返回意外响应:(400)错误请求

WCF客户端 - EncryptedKey子句未包含所需的加密令牌

调用 WCF Web 服务时出现错误的 Json 响应