3

我最近一直在使用 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 响应。

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

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

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

有什么帮助吗?

4

4 回答 4

4

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

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

马特

于 2009-07-27T10:07:10.553 回答
2

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

于 2009-07-27T06:52:27.357 回答
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 不知道如何处理,因为它只是在使用属性时寻找 POST 标头[HttpPost]

要手动允许:

//[HttpPost]
[AcceptVerbs(new string[] {"POST","OPTIONS"})]
于 2010-08-03T18:25:20.767 回答
1

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

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

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

于 2011-01-19T15:04:01.010 回答