Ошибка в ActionFilterAttribute при выполнении вызова AJAX - PullRequest
0 голосов
/ 02 декабря 2011

Я использую 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 View. Но где-то после этого происходит ошибка, и я не могу идти дальше. Ошибка никогда не обнаруживается в событиях ошибки, которые были переопределены. И меня отправляют на пользовательскую страницу ошибок.

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

Спасибо!

1 Ответ

1 голос
/ 02 декабря 2011

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

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

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

...