【发布时间】:2014-01-22 14:45:46
【问题描述】:
我的 c#/WebApi 服务器代码如下:
[HttpPost]
public HttpResponseMessage Logout()
{
// do some stuff here ...
return Request.CreateResponse(HttpStatusCode.OK);
}
在客户端我使用 jquery 2.0.3 进行 ajax 调用
添加:Jquery 代码(打字稿)...
var ajaxSettings: JQueryAjaxSettings = {};
ajaxSettings.type = 'POST';
ajaxSettings.data = null;
ajaxSettings.contentType = "application/json; charset=utf-8";
ajaxSettings.dataType = "json";
ajaxSettings.processData = false;
ajaxSettings.success = (data: any, textStatus: string, jqXHR: JQueryXHR) => {
console.log("Success: textStatus:" + textStatus + ", status= " + jqXHR.status);
};
ajaxSettings.error = (jqXHR: JQueryXHR, textStatus: string, errorThrow: string) => {
console.log("Error: textStatus:" + textStatus + ", errorThrow = " + errorThrow);
};
$.ajax("http://apidev.someurl.com/v1/users/logout", ajaxSettings);
添加 2:上述代码产生的请求标头:
POST http://apidev.someurl.com/v1/users/logout HTTP/1.1
Host: apidev.someurl.com
Connection: keep-alive
Content-Length: 0
Cache-Control: no-cache
Pragma: no-cache
Origin: http://apidev.someurl.com
Authorization: SimpleToken 74D06A21-540A-4F31-A9D4-8F2387313998
X-Requested-With: XMLHttpRequest
Content-Type: application/json; charset=utf-8
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Referer: http://apidev.someurl.com/test/runner/apitest/index.html?
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
响应是 200,但是来自 ajax 调用的错误处理程序被触发,而不是成功处理程序。原因:解析错误,输入意外结束。
一种解决方案是将服务器端代码更改为:
return Request.CreateResponse<String>(HttpStatusCode.OK, "Logout ok");
我了解空响应不是有效的 JSON,但响应消息是故意为空的。 200 说明了一切。 响应标头如下所示:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://apidev.someurl.com
Access-Control-Allow-Credentials: true
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sun, 05 Jan 2014 01:20:30 GMT
Content-Length: 0
这是 jquery 中的错误吗?或者永远不应该那样使用 Request.CreateResponse(OK) ?我应该在客户端使用一些解决方法来解决这个问题吗? AFAIK 服务器在这里没有做错......有什么想法吗?
编辑: 感谢 kevin、nick 和 John 的反馈,这个问题变得清晰起来。我选择的解决方案是返回一个 NoContent
return Request.CreateResponse(HttpStatusCode.NoContent);
对于这种情况,服务器端这似乎是正确的代码。客户端这由 JQuery 完美处理(调用成功处理程序)。感谢大家清理这一切!
(我不知道该给谁的答案...因为 nick 和 kevin 在 cmets 中给出了他们宝贵的反馈,johns 的反馈也增加了更好的理解)...如果没有其他建议...我稍后会将唯一的“答案”标记为答案)
谢谢大家!
【问题讨论】:
-
如果您的 ajax 设置为期望 json,并且 “响应消息故意为空。”,那么这就是它会出错的原因。如果响应应该是 json,则空响应是一个错误。
-
如果您想故意将响应留空,那么您可以改为返回
HttpStatusCode.NoContent- 它仍将被视为成功,但 jQuery 不应该有空响应的问题。 -
我添加了客户端代码。嗯...我确实指定了 datatype="json" ...如果在 200 之外的其他情况下,结果包含客户端更喜欢在 json 中获取的更多信息...。响应标头未指定数据类型的json。我也会插入请求标头...
-
“这是 jquery 中的错误吗” 不,这是故意的。空字符串不是有效的 json,这就是它输入错误的原因。如果你想使用json,你应该让所有响应都返回json,即使它只是
{} -
对这种查看方式的更改是为了使 $.parseJSON 更符合 JSON.parse 的工作方式,这样现代浏览器和旧浏览器的工作方式相同,无论是否不是 $.parseJSON 直接映射到本地方法。