3

我正在尝试执行以下 jQuery.ajax 请求,但遇到了一个奇怪的问题。

当我使用 IE9 发送此请求时,尽管我发送了 contentType 参数,但在 chrome 上该请求正常。

$.ajax({
        type: "POST",
        contentType: "application/x-www-form-urlencoded",        
        url: this.AgentServiceUrl + "/" + methodName,
        data: data,
        async: true,
        success: function (xml, textStatus) { if (successHandler != null) successHandler(xml, textStatus); },
        error: function (xmlHttpRequest, textStatus, errorThrown) { if (errorHandler != null) errorHandler(state, xmlHttpRequest, textStatus, errorThrown); }
    });

我正在使用 jQuery 2.0.2 和 jQuery.XDomainRequest.js 来处理跨域请求。

我能做些什么??

4

1 回答 1

3

$.ajax 使用 XDomainRequest 以允许 AJAX 应用程序发出安全的跨域请求

在 Internet Explorer 8 中,引入了 XDomainRequest 对象。此对象允许 AJAX 应用程序直接发出安全的跨域请求,方法是确保 HTTP 响应只有在数据源指示响应是公共的时才能被当前页面读取

但不幸的是,请求的 Content-Type 标头仅支持 text/plain

在 XDomainRequest 对象的原始化身中,我们允许为 POST 请求指定 Content-Type。有人指出,这违反了我们只发出 HTML 表单可以发出的请求的目标,因为 HTML 表单仅限于以三种不同的内容类型发送数据:text/plain、application/x-www-urlencoded 和 multipart/form-数据。特别是,有人指出,一些 AJAX 服务器库会盲目地假设,如果它们收到带有 SOAP 或 JSON Content-Type 的请求,那么客户端必须是受信任的或同源的(因为 HTML 本身以前无法发出具有该 Content-Type 的跨域请求)。

不幸的是,当我们在后来的 IE8 Beta 中修复了这个问题时,我们做得有点过头了。我们将内容类型限制为 text/plain,但不允许调用者指定数据为 application/x-www-urlencoded 形式。这是有问题的,因为如果指定了 x-www-urlencoded 内容类型,服务器端框架(例如 ASP、ASPNET 等)只会自动将请求的字段解析为名称-值对。

要解决此问题,必须重写当前处理 HTML 表单的服务器代码,以便在接收来自 XDomainRequest 对象的请求时手动将请求正文解析为名称-值对。这使得添加对 XDomainRequest 对象的支持比其他方式更加困难。

资源

于 2013-07-04T10:58:40.203 回答