2009-07-23 51 views
3

我最近一直在使用JSONP和ASP.NET MVC做一些跨域JavaScript。JQuery,XmlHttpRequest和状态代码0

特定的控制器动作将只响应POST请求,这是设计。

在IE8,我可以看到(通过Fiddler2),该响应是正确的,并返回一个HTTP 200响应,与JSONP JavaScript的沿。

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

最初,我以为这是由于COR HTTP预检(Http Access Control)导致的,其中自定义标题或除text/plain之外的其他内容类型会导致发送额外的HTTP请求(带有OPTIONS)谓词到服务器。我可以在Fiddler2中看到OPTIONS请求正在使用HTTP 404响应。

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

为了解决这个问题,我修改了JQuery库,以便不设置自定义标题,并将content-type改为text/plain而不是application/json,并且Firefox最终开始绕开OPTIONS请求,并且只是简单的POST 。

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

任何帮助?

回答

4

原来,你不能使用跨域调用与JQuery使用POST(这是有道理的,因为它呈现一个脚本标记进行调用)。切换到GET排序问题,现在一切正常返回。

不得不通过JQuery源代码来找出一个,但感谢您的答复。

马特

2

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

1

其实不是这种情况。火狐发送选项报头如下所示:

这里是什么是越来越被客户端在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不知道如何处理这一点,因为它只是在寻找一个POST头使用属性时[HttpPost]

要手动允许这样的:

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

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

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

servlet代码,生活就会好:-)