Ошибка атрибута ActionFilterAttribute при выполнении вызова AJAX

Я использую ActionFilter, чтобы проверить, является ли сеанс пользователя самым последним сеансом для этого пользователя. Если они вошли в систему с другим сеансом, старый сеанс недействителен. Итак, я проверяю каждое действие по мере его вызова и выхожу из него, если они не используют самый последний сеанс. Проблема, с которой я столкнулся, заключается в том, что мой подход не работает с вызовами AJAX. Нормальные вызовы GET или POST работают нормально.

public class DuplicateLoginFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var user = Membership.GetUser(HttpContext.Current.User.Identity.Name);
        if (user != null)
        {
            if (!PortalDA.GetUserSession(user.UserName).Trim().Equals(HttpContext.Current.Session.SessionID))
            {

                FormsAuthentication.SignOut();
                filterContext.Result = new RedirectResult(@"\Home\SessionExprired");
            }
        }
        base.OnActionExecuting(filterContext);
    }

Думаю, моя самая большая проблема в решении этой проблемы заключается в том, что я получаю сообщение об ошибке, но нигде не могу ее найти.

У меня есть специальные ошибки, включенные в webconfig. Я переопределяю событие OnException на всех своих контроллерах. Я также отменяю событие Application_Error в global.asax.

Я прошел через код, когда я делаю вызов AJAX, я возвращаю представление SessionExpired. Но где-то после этого возникает ошибка, и я не могу двигаться дальше. Ошибка никогда не перехватывается в событиях ошибки, которые были переопределены. И меня отправляют на страницу пользовательской ошибки.

Я подозреваю, что это как-то связано с HTTPHeaders, но я недостаточно разбираюсь в них, чтобы знать, как это исправить, если это вызов AJAX.

Спасибо!


person Ryand.Johnson    schedule 02.12.2011    source источник


Ответы (1)


Попробуйте выполнить перенаправление с использованием ваших маршрутов, а не жестко кодировать URL-адрес:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary(new 
    {
        controller = "Home",
        action = "SessionExpired"
    }
));

Затем убедитесь, что действие SessionExpired существует на HomeController вместе с соответствующим представлением и что это действие выполнено. Очевидно, поскольку вы перенаправляете внутри вызова AJAX, все, что вы получите в обратном вызове успеха вашего вызова AJAX, - это HTML-код этого представления SessionExpired, переданный в качестве аргумента. Не ожидайте, что браузер будет перенаправлять. Вам нужно будет использовать window.location.href для ручного перенаправления браузера. Это причина, по которой в этом случае (AJAX) лучше вернуть результат Json вместо перенаправления на действие с истекшим сроком действия сеанса. Затем на стороне клиента вы можете выполнить перенаправление вручную.

person Darin Dimitrov    schedule 02.12.2011
comment
Получил тот же результат (отправлено на страницу с ошибкой). Да, действие и просмотр существует. Он работает, когда это обычный GET или POST. Только не при вызове AJAX - person Ryand.Johnson; 02.12.2011
comment
Вот и все! Я вернул объект JSON и перенаправил в JQuery. Спасибо! - person Ryand.Johnson; 02.12.2011