JQuery AjaxComplete方法剥离自定义标头?

时间:2012-01-15 04:45:13

标签: javascript jquery ajax asp.net-mvc

我正在尝试按照此SO帖子的解决方案中的选项#3:A controller action which returns a partial view inserts the logon page when authorization fails

我在jquery的ajaxComplete方法中读取自定义标头时遇到问题。

我已经在fiddler和chrome的调试工具中确认自定义标头实际上是由浏览器发回和接收的......

响应标题(在Fiddler中):

Server: ASP.NET Development Server/10.0.0.0
Date: Sun, 15 Jan 2012 04:00:13 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Unauthorized: 1
Cache-Control: private
Content-Length: 0
Connection: Close

响应标头(由Chrome收到):

Cache-Control:private
Connection:Close
Content-Length:0
Date:Sun, 15 Jan 2012 04:12:13 GMT
Server:ASP.NET Development Server/10.0.0.0
Unauthorized:1
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0

响应标头(通过调用传递给ajaxComplete的xmlHttpRequest变量中的“getAllResponseHeaders()”):

Date: Sun, 15 Jan 2012 04:42:21 GMT
X-AspNet-Version: 4.0.30319
Connection: Close
Content-Length: 65
X-AspNetMvc-Version: 3.0
Server: ASP.NET Development Server/10.0.0.0
Content-Type: application/json; charset=utf-8
Cache-Control: private

有趣的是,在返回原始ajax请求时调用的函数(由jquery启动)确实会收到Unauthorized头。

有谁知道这里发生了什么以及我可以做些什么来解决这个问题?

这是我的“ajaxComplete”javascript代码

$(document).ajaxComplete(function (event, request, settings) {
        alert(request.getResponseHeader('Unauthorized'));
    });

2 个答案:

答案 0 :(得分:1)

你可以看看here。如果您在页面上使用相同的插件(ajaxmanager)可能会有所帮助。如果没有,请检查您的其他插件。

答案 1 :(得分:0)

Vucetica最初的反应让我思考,我花了最后一小时查看jquery的代码。我的自定义标题现在回来了。看起来问题源于我的代码中原始ajax请求的成功回调中的未处理异常。

肯定是我应该修复的东西,但是jquery允许自己以一种无声地失败并且只影响自定义头的方式容易受到影响。这种意想不到的行为最初导致我走错了方向。

无论如何,感谢大家的帮助。

为了完整起见,这是我之前和之后的代码。

之前(在ajaxComplete方法中没有收到自定义标头)

$.ajax({
    type: "GET",
    url: "/Game/GetPlay/27?roundId=" + that.gameState.RoundToDisplay,
    contentType: "application/json; charset=utf-8",
    data: {},
    dataType: "json",
    success: function (play, request, settings) {
        that.play = play;
        that.startGame();
    },
    error: null,
    cache: false
});

之后(工作)

$.ajax({
    type: "GET",
    url: "/Game/GetPlay/27?roundId=" + that.gameState.RoundToDisplay,
    contentType: "application/json; charset=utf-8",
    data: {},
    dataType: "json",
    success: function (play, request, settings) {
        that.play = play;
        try {
            that.startGame();
        } catch(err){

        }
    },
    error: null,
    cache: false
});