jquery.ajax发布请求在IE9中缺少内容类型,适用于Chrome

时间:2013-07-02 14:06:01

标签: internet-explorer jquery post content-type

我正在尝试执行以下jQuery.ajax请求,我面临一个奇怪的问题。

当我使用IE9发送此请求时,虽然我发送了chromeType请求,但是我仍然缺少contentType参数。

$.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来处理跨域请求。

我该怎么办?

1 个答案:

答案 0 :(得分:3)

$ .ajax使用XDomainRequest以允许AJAX应用程序进行安全的跨源请求

  

在Internet Explorer 8中,引入了XDomainRequest对象。这个   object允许AJAX应用程序发出安全的跨源请求   直接确保HTTP响应只能被读取   当前页面,如果数据源指示响应是公开的

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

  

在XDomainRequest对象的原始版本中,我们允许   POST请求的Content-Type规范。有人指出   这违反了我们只发出HTML请求的目标   表单可以发布,因为HTML表单仅限于发送数据   三种不同的内容类型:text / plain,   application / x-www-urlencoded和multipart / form-data。特别是,   有人指出,一些AJAX服务器库会盲目地   假设他们收到带有SOAP或JSON的请求   Content-Type,然后客户端必须是可信任的或Same Origin   (因为HTML本身以前没有提供交叉来源的方法   具有该Content-Type的请求。)

     

不幸的是,当我们在以后的IE8测试版中修复此问题时,我们就去了   有点太远;我们将内容类型限制为text / plain,但没有   允许调用者指定数据所在的位置   application / x-www-urlencoded表单。这是有问题的,因为   服务器端框架(例如ASP,ASPNET等)只会自动生成   如果x-www-urlencoded,则将请求的字段解析为名称 - 值对   指定了内容类型。

     

要解决此问题,请使用当前处理HTML的服务器代码   必须重写表单以手动解析请求主体   从XDomainRequest对象接收请求时的名称 - 值对。   这使得添加对XDomainRequest对象的支持更加困难   比起其他情况。

Source