在HandleUnauthorizedRequest之前,Ajax请求命中错误函数

时间:2013-11-01 10:42:27

标签: c# javascript ajax asp.net-mvc-3 cordova

我有一个PhoneGap应用,正在与C#服务进行通信以获取数据。用户必须登录才能访问其中任何一个,因此我的控制器上有AuthorizeAttribute。这工作正常,正确,投入到我的应用程序。对我来说问题是,在我的AuthorizeAttribute中,我覆盖了HandleUnauthorizedRequest方法,而 应该 返回401.实际上,它可能是是的,只是Ajax处理程序在我的override方法返回之前命中了错误函数。

AuthorizeAttribute

public class AppCustomAuthorization : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.HttpContext.Response.End();

        base.HandleUnauthorizedRequest(filterContext);
    }
}

的Ajax

$.ajax({
    type: "GET",
    url: url + "checkin/app/info",
    dataType: "json",
    success: function(d) {
        // Do stuff
    },
    error: function (xhr, textStatus, errorThrown) {
        app.showError(errorThrown); // Status code is 0
    }
});

当我查看Network次请求时,我的获取请求似乎已取消。最初,我认为这是因为我的authorize属性导致它取消请求,但是,它似乎在它到达我的处理程序之前取消。

2 个答案:

答案 0 :(得分:2)

这可能是因为同源政策。看看这个:

http://docs.phonegap.com/en/1.9.0/guide_whitelist_index.md.html

答案 1 :(得分:2)

为了结束完整的问题,我看到响应代码为0的原因是:

  

状态代码“0”通常表示用户导航到其他人   AJAX调用完成之前的页面

我是从 this SO answer 得到的,在撰写本文时有超过70,000次观看,所以我猜这个问题可能会发生很多。这显然让我看看可能导致我的应用程序在其他地方导航的原因,当然,在我的代码中我有:

$('[data-role=page]').on('pageshow', function (event, ui) {
if ($(location).attr('pathname').indexOf('login.html') == -1)
    if (window.localStorage['UserName'] == null || window.localStorage['Password'] == null) 
        window.location = "login.html";
}):

作为从应用程序开发的早期阶段开始的解决方法,作为一种原始类型的检查,用户实际上已登录。