你会如何克服这个问题? Jquery + ajax +服务器超时

时间:2010-06-21 20:38:41

标签: c# jquery asp.net-mvc

我正在使用asp.net mvc,C#和jquery。我的网站大量使用ajax。这导致了一个问题,我不知道如何解决它(比我目前的解决方案更好地解决它)。

情景。

  1. 用户登录我的网站 - cookie设置,服务器超时30分钟
  2. 用户离开30分钟
  3. 用户回来点击我的一个启用了ajax的jquery标签
  4. 请求已发送至服务器
  5. 服务器失败用户超时将其发送回登录页面。
  6. 因为它是一个ajax请求,重定向会在选项卡中呈现。它看起来很丑陋(在标签中呈现整个页面),用户可能在这一点上非常困惑。
  7. 问题

    1. 就服务器和ajax而言,ajax请求有效并且成功响应被发回。因此,我无法检查错误,因为请求成功,而不是正确的数据回来。
    2. 解决方案1 ​​

      1. 用户登录网站。
      2. Jquery ajax请求查找用户超时
      3. 超时比服务器超时少60秒
      4. 一旦javascript端超时被击中。出现Jquery对话框并告诉他们他们的会话已过期并强制他们重定向到登录包。
        • 用户无法点击任何内容,因为对话框会阻止该操作。如果某些用户使用firebug或者他们可以移除它,但服务器超时仍然会生效,他们将获得丑陋的版本(不要在意)。
      5. 如果用户发出ajax请求,则会重置服务器端的超时以及客户端的超时。
      6. 问题

        1. 用户可以走开,另一个人可能会来,超时消息可能会启动,但他们仍有可能有45秒的时间尝试发出新请求并重置超时。这非常低,并不太担心。

        2. 有时我观察到它只是超时(客户端)而我不知道为什么。我永远无法重现问题(似乎发生在其他人身上,但在我测试时却没有)。所以我猜测有些东西没有写入或出现其他问题。

        3. 所以数字2真的是我想找到另一个解决方案的重要原因。

          解决方案2(推测)。

          我想也许我可以制作自己的响应标题或其他什么,如果服务器超时,那么我可以发送一些303重定向或我可以检查的那种性质的东西,然后根据它进行jquery重定向。 / p>

          但是我不知道在我的C#代码中该怎么做,或者我可以做那样的事情。

3 个答案:

答案 0 :(得分:3)

您可以随时在LogOn操作中添加自定义HTTP标头,该标头可以被AJAX调用拦截并相应地执行操作:

public ActionResult LogOn()
{
    Response.AddHeader("X-LOGON", "LogOn");
    return View();
}

在成功回调中检查是否存在此标题:

$.ajax({
    url: '/home/someaction',
    success: function (data, textStatus, XMLHttpRequest) {
        if (XMLHttpRequest.getResponseHeader('X-LOGON') === 'LogOn') {
            // the LogOn page is being displayed 
            // probably timeout or unaithorized => act accordingly
        }
    }
});

答案 1 :(得分:2)

我不明白为什么你的身份验证处理程序(动作过滤器)无法通过返回403(禁止)来处理这个问题,然后通过将window.location设置为/ login来处理AJAX处理程序。

答案 2 :(得分:2)

我基本上做了解决方案1,除了(1)我已将其封装到插件中(2)我在呈现时在页面中注入会话超时。您可以在此http://farm-fresh-code.blogspot.com中查看我的博客article上的详细信息。另外一点是,当客户端超时时,它会自动调用注销操作以实际终止会话。