【发布时间】:2012-12-31 23:25:54
【问题描述】:
我正在使用 jQuery ajax 从我的站点向 asmx 服务发出跨域请求,如下所示:
$j.ajax({
url: svcURL,
type: "POST",
data: xml,
contentType: "text/xml",
dataType: "text",
success: function(d) {
alert(d);
},
error: function(a, b, c) {
alert("error");
}
});
此POST 请求之前有一个预检OPTIONS 请求,该服务当前未配置为处理该请求,因此它返回500 (Internal Server Error) 或405 (Method Not Allowed)。
收到此错误后,我希望浏览器随后会忽略POST 请求并返回错误,但是:
在 Chrome 和 IE 中仍会发送 POST 请求(服务已正确配置为处理该请求)并收到响应。
在 Firefox 中,POST 只会返回错误。
有人能解释一下为什么这在 Chrome 中有效吗?我本来希望它的行为与 Firefox 一样。
提前感谢您的帮助。
【问题讨论】:
-
您确定 OPTIONS 请求确实被触发了吗?您是否看到它在网络选项卡或萤火虫中返回响应?
-
是的,我可以看到 OPTIONS 请求正在控制台/Fiddler 中发送。使用我正在使用的当前服务,我得到 405 错误响应。随后的 POST 在 Chrome 中运行,但在 Firefox 中返回错误。
-
我有一个测试 CORS 请求的页面。当我尝试使用
Content-Type: text/xml发出 POST 请求时,我收到一个错误:client.cors-api.appspot.com/… 你看到同样的行为吗?请注意 OPTIONS 请求是如何在 Chrome 的网络浏览器中被拒绝的。 -
我已将我的服务配置为允许 Content-Type 标头,因此我看不到与您相同的行为。对于我的请求,Chrome 的控制台显示:
OPTIONS http://website.com/svc.asmx 405 (Method Not Allowed) -
在Chrome中请求成功后,
Content-Type的header还是text/xml吗?也许它将请求降级为不需要预检的简单请求。 (对于浏览器来说,这似乎是一件非常愚蠢的事情,但也许 jQuery 可以做到?)
标签: javascript ajax post cross-domain cors