我最近一直在使用 JSONP 和 ASP.NET MVC 编写一些跨域 javascript。
特定的 Controller 操作将仅响应 POST 请求,这是设计使然。
在 IE8 中,我可以(通过 Fiddler2)看到响应是正确的,并返回 HTTP 200 响应以及 JSONP javascript。
在 Firefox、Safari 和 Chrome 中,仍然会返回响应,并带有适当的 HTTP 200 代码和 JSONP 内容,唯一的区别是 JQuery 使用的 XmlHttpRequest 对象将状态代码设置为 0,并且responseText清空。
最初,我认为这是由于 COR HTTP 预检(Http 访问控制)造成的,自定义 header 或除 text/plain 之外的内容类型会导致额外的 HTTP 请求(带有 OPTIONS)动词发送到服务器。我可以在 Fiddler2 中看到 OPTIONS 请求正在通过 HTTP 404 进行响应。
Web 服务器是 IIS7(但生产 Web 服务器将是 IIS6 机器)。在 IIS7 中,我可以看到处理程序中列出的标准 OPTIONSVerbHandler,但我不相信这实际上在做任何事情(事实上,我什至在任何地方都找不到有关 OPTIONSVerbHandler 的任何文档)。
为了解决这个问题,我修改了 JQuery 库以不设置自定义 header ,并将内容类型更改为 text/plain 而不是 application/json,Firefox 最终开始绕过 OPTIONS 请求,而只是简单的 POST。
问题仍然在于空响应(根据 XmlHttpRequest 对象),即使 Fiddler2 显示成功的 HTTP 200 响应,并且正在返回内容。
有什么帮助吗?
最佳答案
事实证明,您不能使用 POST 与 JQuery 进行跨域调用(这是有道理的,因为它呈现脚本标记来进行调用)。切换到 GET 解决了问题,现在一切都正确返回。
必须浏览 JQuery 源代码才能弄清楚这一点,但感谢您的回复。
马特
关于JQuery、XmlHttpRequest 和状态代码 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1171490/