带有POST或PUT的jQuery.ajax没有IE8和IE9的响应头

Arm*_*nco 1 ajax jquery xmlhttprequest http-headers jqxhr

我注意到使用IE8和IE9,如果我使用带有POSTPUT谓词的jQuery.ajax()调用我的RESTful API ,那么我不会在jqXHR中找回任何响应头.但是,GET请求按预期工作.

此行为与所有其他浏览器不同.我已经确认Chrome,FF,Opera和Safari都会在POST和PUT请求的响应中返回完整的预期标头集.只有IE8和IE9似乎在地板上扔标题.(我没有检查的一件事是HEAD请求会发生什么.)

我已经用Fiddler验证了标题实际上是通过线路进行的,所以问题出在jQuery本身或IE8和IE9上.

这是一个已知的问题?如果是这样,是否有解决方法.我可以在jQuery中重载/覆盖某些内容以保留POST和PUT后的头文件吗?我目前的解决方法是在成功回调中使用GET简单地重新获取修改后的数据,因为IE8和IE9不会混淆GET操作的头文件.

这是我基于jQuery的主要AJAX工作方法的片段:

    $.ajax({
        url: String.format(um.proxy.url, url),
        type: ajaxParams.verb,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: String.format('{0}', ajaxParams.jsonData),
        headers: mapOfHeaders,
        success: function (data, textStatus, jqXHR) {
            //...
        },
        error: function (msg, textStatus, errorThrown) {
            //...
        }
    });
Run Code Online (Sandbox Code Playgroud)

Arm*_*nco 5

事实证明,这是IE的所有当前风格(7,8和9)的已知问题.如果响应代码是204,那么IE只会抛出所有标题.对于像我这样编写需要最新eTag进行并发检查的纯AJAX实现的人来说,IE杀死了纯AJAX方法,迫使我立即进行GET来获取当前的eTag.:捂脸:

以下是我设法挖掘的几篇文章:

在Internet Explorer中的HTTP无内容响应中缺少ETag标头

http://dalelane.co.uk/blog/?p=2043

response.headers.ETag undefined

http://datajs.codeplex.com/discussions/398295

一个部分解决方法是嗅探IE,然后立即执行HEAD请求以获取ETag,但这种方法的问题是,如果有人设法潜入你并更新记录,你将获得eTag因为她的变化,不是你的.所以这不是一个可接受的解决方法.

所以,我嗅了IE并立即进行GET.否则对于所有其他浏览器,我只需使用jQuery的jqXHR.getResponseHeader(namespace.constants.headers.eTag)来获取eTag.