Глобальное уведомление "ajax call" с asp.net mvc / jquery - PullRequest
2 голосов
/ 12 мая 2010

Мне нужно получать уведомления в любое время, когда крупное веб-приложение asp.net mvc выполняет ajax-вызов на сервер. Мы используем как jquery, так и встроенные методы Ajax. * Для выполнения удаленных вызовов, и я хотел бы получить глобальный способ узнать, когда мы делаем вызов, без необходимости вручную вводить какой-то метод IsMakingCall для каждого запрос.

Основная проблема, которую мы пытаемся решить, - это тайм-аут сеанса. Если пользователь покидает страницу и уходит на обед (например), он получает ошибки, когда возвращается, потому что вызов ajax возвращает страницу входа в систему вместо ожидаемого результата json или частичного HTML.

Моя идея состояла в том, чтобы иметь таймер js, который будет сбрасываться каждый раз, когда мы делаем вызов ajax. Таким образом, если таймер истекает (т.е. время их сеанса истекло), я могу просто автоматически выйти из системы. Так работают такие сайты, как Банк Америки и mint.com.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 12 мая 2010

Я решаю проблему, которую вы описываете по-другому, на стороне клиента. У меня есть плагин jQuery на моей главной странице, который будет предлагать пользователю возобновить свою сессию через диалоговое окно непосредственно перед истечением срока его действия. Если пользователь не отвечает (или нажимает кнопку выхода), он вызывает действие выхода из приложения. Если пользователь «возобновляет» свой сеанс, он выполняет обратный вызов AJAX на сервер, сбрасывая скользящее окно на стороне сервера.

Вы можете найти код в моем блоге, http://farm -fresh-code.blogspot.com . Сейчас он не учитывает действия AJAX, которые могут возобновить сеанс, но вы можете настроить его так, чтобы jQuery AJAX через глобальный ajaxStart сбрасывал таймер. Он использует ajaxStart для сброса таймера при выполнении запроса JQuery AJAX. Я не использую MS AJAX, поэтому я не уверен, есть ли глобальный хук, который вы можете использовать. Это не выглядит так при проверке кода, но вы можете вручную добавить его через AjaxOptions для каждого запроса. Вы также можете исследовать добавление обработчика в Sys.Net.WebRequestManager.

4 голосов
/ 13 мая 2010

По сути, проблема здесь в том, что поведение по умолчанию возвращает страницу входа. Результатом этого является 200 OK, что для jQuery - успешный вызов. Исправьте эту обработку для вызовов ajax из MVC, и все будет хорошо.

Я думаю, что самый простой способ справиться с этим - изменить способ авторизации для сценариев ajax. Вы можете определить, является ли запрос Ajax в этот момент, и вернуть аналогичный код состояния, для которого ASP.NET не вызывает перенаправление входа в систему (403). Затем jQuery будет интерпретироваться как сбой и попадет в этот код клиентского скрипта.

После этого вы можете легко использовать совместно используемую функцию в общем js-файле для удобного способа сообщить пользователю, что у них закончился сеанс.

Нечто подобное может сделать это

public class AjaxAuthorize : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new ContentResult();
            filterContext.HttpContext.Response.StatusCode = 403; // 401 would make ASP.NET return the login page and a 200 OK status
        }
        else
            base.HandleUnauthorizedRequest(filterContext);
    }
}
0 голосов
/ 12 мая 2010

Полагаю, вам следует создать функции-обработчики по умолчанию для success или begin в среде jQuery Ajax, в зависимости от того, когда вы хотите, чтобы уведомление было отправлено ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...