Как предотвратить опрос AJAX, поддерживающий сеансы Asp.Net

У нас есть приложение ASP.Net, которому было дано 20-минутное скользящее окончание сеанса (и cookie). Однако у нас есть несколько AJAX, которые опросили сервер для получения новой информации. Недостатком этого, конечно же, является то, что сессия будет продолжаться бесконечно, так как она поддерживается живыми вызовами, заставляя время истечения срока обновления обновляться. Есть ли способ предотвратить это, т.е. Разрешить обновление сеанса только для вызовов без аякса?

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

Другие обсуждения в Stackoverflow в этом разговоре о поддержании 2 отдельных приложений (один для аутентифицированных вызовов, один для не прошедших проверку подлинности). Я не уверен, что это будет вариант, поскольку все вызовы должны быть аутентифицированы.

Любые идеи?

Ответ 1

Поскольку этот вопрос старый, я предполагаю, что он был решен или обходной путь реализован. Однако я хотел упомянуть, что вместо AJAX-опроса сервера для выполнения операции мы использовали SignalR, который позволяет как клиенту взаимодействовать с сервером через JQuery, так и/или серверу, чтобы уведомить клиента.

Проверьте это: Узнайте о ASP.NET SignalR

Ответ 2

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

    [HttpPost]
    public ActionResult Run()
    {
        Response.Cookies.Remove(FormsAuthentication.FormsCookieName);

        return Json("");
    }

Ответ 3

Я сделал это, создав скрытую страницу в i-Frame. Затем, используя JavaScript, он возвращается каждые 18 минут, чтобы сохранить сеанс в активном режиме. Это работает очень хорошо.

Этот пример из проекта ASP.NET Forms, но может быть изменен для MVC.

  • Создайте страницу с именем KeepSessionAlive и добавьте тег метаобновления

    meta id = "MetaRefresh" http-equiv = "refresh" content = "21600; url = KeepSessionAlive.aspx"

  • В коде <

      защищенная строка WindowStatusText = "";

    protected void Page_Load(object sender, EventArgs e)
    {
        //string RefreshValue = Convert.ToString((Session.Timeout * 60) - 60);
    
        string RefreshValue = Convert.ToString((Session.Timeout * 60) - 90);
    
        // Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter.
        MetaRefresh.Attributes["content"] = RefreshValue + ";url=KeepSessionAlive.aspx?q=" + DateTime.Now.Ticks;
    
        WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
    }
    
  • Добавить скрытый iFrame на главной странице

    iframe ID = "KeepAliveFrame" src= "KeepSessionAlive.aspx" frameBorder = "0" width = "0" height = "0"

Загрузить пример