jquery.post()从MVC 4 WebAPI返回200 OK,但是命中了错误处理程序

时间:2012-10-28 19:32:55

标签: jquery cross-domain asp.net-web-api jquery-post

我有一个奇怪的情况,我的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的工作效果很好。

所以问题当然是:我在这里做错了什么?为什么错误处理程序命中?

谢谢!

4 个答案:

答案 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或其他地方运行它,那么它将是跨域请求。 httphttps:的对比也有所不同。

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)

据我了解,您需要跨域,因此您应该有一个处理程序或服务调用者

阅读THIS它可能对您有用。

在应用程序启动时添加JsonpFormatter作为过滤器,然后您可以享受jsonp。

答案 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);
}

请注意参数列表中的更改