【问题标题】:JQuery, XmlHttpRequest and Status Code 0JQuery、XmlHttpRequest 和状态码 0
【发布时间】:2010-11-13 09:03:27
【问题描述】:

我最近一直在使用 JSONP 和 ASP.NET MVC 做一些跨域 javascript。

特定的控制器操作只会响应 POST 请求,这是设计使然。

在 IE8 中,我可以(通过 Fiddler2)看到响应是正确的,并返回 HTTP 200 响应以及 JSONP javascript。

在 Firefox、Safari 和 Chrome 中,响应仍在返回,带有适当的 HTTP 200 代码和 JSONP 内容,唯一的区别是 JQuery 使用的 XmlHttpRequest 对象将状态码设置为 0,而 responseText清空。

最初,我认为这是由于 COR HTTP Preflighting(Http 访问控制),因此自定义标头或 text/plain 以外的内容类型会导致额外的 HTTP 请求(带有 OPTIONS)动词被发送到服务器。我可以在 Fiddler2 中看到 OPTIONS 请求正在被 HTTP 404 响应。

网络服务器是 IIS7(但生产网络服务器将是一个 IIS6 机器)。在 IIS7 中,我可以看到处理程序中列出的标准 OPTIONSVerbHandler,但我不相信这实际上是在做任何事情(事实上,我什至在任何地方都找不到关于 OPTIONSVerbHandler 的任何文档)。

为了解决这个问题,我修改了 JQuery 库以不设置自定义标头,并将内容类型更改为 text/plain 而不是 application/json,Firefox 最终开始绕过 OPTIONS 请求,而只是简单的 POST。

问题仍然在于空响应(根据 XmlHttpRequest 对象),即使 Fiddler2 显示成功的 HTTP 200 响应,并且正在返回内容。

有什么帮助吗?

【问题讨论】:

    标签: jquery json xmlhttprequest jsonp status


    【解决方案1】:

    实际上并非如此。 Firefox 会发送如下所示的 OPTION 标头:

    这是客户端在 Firefox 中设置的内容:

    选项 /MvcApplication/Json/Test1 HTTP/1.1 主机:acoheni580 用户代理:Mozilla/5.0(Windows;U;Windows NT 6.1;en-US;rv:1.9.2.8)Gecko/20100722 Firefox/3.6.8 接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 接受语言:en-us,en;q=0.5 接受编码:gzip,deflate 接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活:115 连接:保持活动 来源:http://localhost 访问控制请求方法:POST

    Mvc 不知道如何处理这个问题,因为它只是在使用属性[HttpPost] 时寻找 POST 标头

    手动允许:

    //[HttpPost]
    [AcceptVerbs(new string[] {"POST","OPTIONS"})]
    

    【讨论】:

      【解决方案2】:

      除了客户端的所有明显错误外,主要原因是壁虎引擎在servlet的标头中查找Access-Control-Allow-Origin。如果它没有找到它,它将中止通信,你会得到一个status=0statusText=null。此外,moz-nullprincipal in xml 解析错误。所有这些东西都非常具有误导性。解决这个问题只需要:

      response.setHeader("Access-Control-Allow-Origin","*");
      

      servlet 代码中,生活会很好:-)

      【讨论】:

        【解决方案3】:

        事实证明,您不能使用 POST 将跨域调用与 JQuery 一起使用(这是有道理的,因为它会呈现一个脚本标记来进行调用)。切换到 GET 解决了问题,现在一切都正确返回了。

        必须通过 JQuery 源来解决这个问题,但感谢您的回复。

        马特

        【讨论】:

          【解决方案4】:

          尝试在 Firefox 中使用 firebug 来查看实际发送的请求。查看 net 选项卡以查看 HTTP 请求和响应。也许有些东西配置错误?我还在 firefox 中使用 jsonview 查看设置 applcaiton/json mimietype 的 JSON 数据。遗憾的是它不处理 JSONP,但它关闭了。

          【讨论】:

            猜你喜欢
            • 2013-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多