我最近使用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访问控制),其中自定义标头或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响应,并且正在返回内容。
任何帮助?
答案 0 :(得分:4)
事实证明,你不能使用POST与JQuery进行跨域调用(这是有意义的,因为它呈现一个脚本标记来进行调用)。切换到GET排序问题,现在一切都正确返回。
不得不通过JQuery源代码来解决这个问题,但感谢您的回复。
马特
答案 1 :(得分:2)
尝试在firefox中使用firebug查看实际发送的请求。查看网络选项卡以查看HTTP请求和响应。也许有些东西配置错误了?我还在firefox中使用jsonview来查看设置applcaiton / json mimietype的JSON数据。可悲的是,它没有处理JSONP,但它的关闭。
答案 2 :(得分:1)
其实不是这种情况。 Firefox发送如下的OPTION标题:
以下是客户端在Firefox中设置的内容:
OPTIONS /MvcApplication/Json/Test1 HTTP/1.1 Host: acoheni580 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Origin: http://localhost Access-Control-Request-Method: POST
Mvc不知道如何处理这个问题,因为它只是在使用属性[HttpPost]
手动允许:
//[HttpPost]
[AcceptVerbs(new string[] {"POST","OPTIONS"})]
答案 3 :(得分:1)
除了客户端上的所有明显错误之外,主要原因是gecko引擎在Access-Control-Allow-Origin
的标头中查找servlet
。如果找不到,它将中止通信,您将获得status=0
和statusText=null
。此外,xml解析错误中的moz-nullprincipal
。所有这些都是非常误导的。解决此问题的所有方法是:
response.setHeader("Access-Control-Allow-Origin","*");
在servlet
代码中,生活会很好:-)