我有一个奇怪的情况,我的jquery.post返回代码#200(OK),但错误处理程序被命中。
这是我的MVC WebAPI服务器端代码(只需返回代码#200 OK):
[HttpPost]
public HttpResponseMessage Post(T input)
{
//_handler.Create(input);
return Request.CreateResponse(HttpStatusCode.OK);
}
这是我的客户端脚本
ServerAccess.prototype.Save = function (m) {
$.post("http://localhost:55482/M/", m)
.success(
function (o) {
alert("success");
})
.error(
function (xhr, textStatus, errorThrown) {
if (typeof console == 'object' && typeof console.log == 'function') {
console.log(xhr);
console.log(textStatus);
console.log(errorThrown);
}
}
);
};
Firebug中的控制台输出是:
POST
http://localhost:55482/M/
200 OK 894ms接头
响应标头
内容长度6
Content-Type application / json;字符集= UTF-8
Date Sun,28 Oct 2012 18:55:17 GMT
服务器Microsoft-HTTPAPI / 2.0
请求标题
接受 /
接受编码gzip,deflate
Accept-Language nb-no,nb; q = 0.9,no-no; q = 0.8,no; q = 0.6,nn-no; q = 0.5,nn; q = 0.4,en-us; q = 0.3,连接; q = 0.1
连接保持活力
Content-Length 21
Content-Type application / x-www-form-urlencoded;字符集= UTF-8
主机localhost:55482
Origin null
User-Agent Mozilla / 5.0(Windows NT 6.2; WOW64; rv:16.0)Gecko / 20100101 火狐/ 16.0
和
对象{readyState = 0,status = 0,statusText =“error”}
错误
(空字符串)
我浏览了周围,看到其他人遇到了类似的问题,通常在回复中出现了JSON格式错误。由于我只返回200 OK,没有内容,这似乎不适合我的情况。但是我确实尝试返回一个像这样的空对象
var o = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new T());
return Request.CreateResponse(HttpStatusCode.OK, o);
服务器端从Visual Studio 2012运行,客户端只是一个带有一些.js文件的独立.html。另外,在VS中有一个断点我知道服务器收到了请求,而且Postman for Chrome的工作效果很好。
所以问题当然是:我在这里做错了什么?为什么错误处理程序命中?
谢谢!
答案 0 :(得分:3)
请改为尝试:
ServerAccess.prototype.Save = function (m) {
$.ajax({
"type": "POST",
"url": "http://localhost:55482/M/",
"data": m,
"dataType": "json",
"success": function (data, textStatus, xhr) {
alert("success");
},
"error": function (xhr, textStatus, errorThrown) {
if (typeof console === 'object' && typeof console.log === 'function') {
console.log(xhr);
console.log(textStatus);
console.log(errorThrown);
}
}
});
};
这允许您设置预期的返回MIME类型application/json
。
<强>更新强>
如果您在http://localhost:55482
上运行独立HTML页面,那么它将不是跨域的。如果您在file:///C:/Users/.../Desktop/test.htm
或其他地方运行它,那么它将是跨域请求。 http
与https:
的对比也有所不同。
jsonp
请求是GET
请求,不能是POST
。这是因为jsonp
请求是通过向页面添加<script>
元素并将源设置为您的网址来实现的,其中data
附加到查询字符串(加上时间戳参数)。任何期望POST
返回的jsonp
次请求都应自动转换为GET
次请求。
最后,由于你的例程需要返回数据,你需要返回一些实际数据,因为jQuery将尝试解析返回到对象中的JSON(如果没有返回数据则无法执行)并且会抛出错误如果无法解析数据。
尝试将您的回复消息更改为:
String o = "success";
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
return Request.CreateResponse(HttpStatusCode.OK, ser.Serialize(o));
答案 1 :(得分:0)
答案 2 :(得分:0)
很可能它与您发送的空响应有关。请参阅此错误报告:http://aspnetwebstack.codeplex.com/workitem/1664
您可以通过将空字符串设置为响应来解决此问题。
return Request.CreateResponse(HttpStatusCode.OK, "");
错误报告包含一个解决方法,其中包括创建一个消息处理程序,该处理程序在content == null处添加一个空字符串。
public class HttpResponseMessageHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (response.Content == null && request.Headers.Accept.Any(a => a.MediaType == "application/json"))
{
var content = new StringContent("{}");
content.Headers.ContentLength = 2;
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
response.Content = content;
}
return response;
}
}
答案 3 :(得分:0)
我在向WebApi 2服务使用JSON请求时遇到此问题。对我来说,只需更改成功和错误功能的参数列表即可解决(WebApi端无需更改)
我改变了我的代码
success: function (data) { alert(data); },
error: function (error) { jsonValue = jQuery.parseJSON(error.responseText); }
到这个
success: function (data, textStatus, xhr)
{
alert("data: " + data + "\ntextStatus: " + textStatus + "\nxhr: " + xhr);
},
error: function (xhr, textStatus, errorThrown)
{
alert("xhr: " + xhr + "\ntextStatus: " + textStatus + "\nerrorThrown " + errorThrown);
}
请注意参数列表中的更改