【问题标题】:Global "ajax call" notification with asp.net mvc/jquery使用 asp.net mvc/jquery 的全局“ajax 调用”通知
【发布时间】:2010-05-12 16:40:24
【问题描述】:

每当大型 asp.net mvc Web 应用程序对服务器进行 ajax 调用时,我都需要得到通知。我们同时使用 jquery 和内置的 Ajax.* 方法来进行远程调用,我想要一种全局方式来知道我们何时进行调用,而不必手动向每个人注入某种“IsMakingCall”方法请求。

我们试图解决的根本问题是会话超时。如果用户离开页面去吃午饭(例如),当他们回来时会收到错误,因为 ajax 调用返回的是登录页面,而不是预期的 json 或部分 html 结果。

我的想法是有一个 js 计时器,只要我们进行 ajax 调用,它就会被重置。这样,如果计时器用完(即他们的会话现在已超时),我可以自动将它们注销。这就是美国银行和 mint.com 等网站的运作方式。

谢谢!

【问题讨论】:

    标签: asp.net-mvc ajax jquery


    【解决方案1】:

    我在客户端以不同的方式处理您描述的问题。我的母版页上有一个 jQuery 插件,它将提示用户在会话设置过期之前通过对话框更新会话。如果用户没有响应(或单击注销),它会在应用程序上调用注销操作。如果用户“更新”他们的会话,它会向服务器发出 AJAX 回调,重置滑动窗口服务器端。

    您可以在我的博客http://farm-fresh-code.blogspot.com 上找到code目前它不考虑可能更新会话的 AJAX 操作,但您可以检测它,以便 jQuery AJAX 通过全局 ajaxStart 重置计时器。它使用 ajaxStart 重置发出 jQuery AJAX 请求时的计时器。我不经常使用 MS AJAX,所以我不确定是否有可以使用的全局钩子。检查代码并没有出现这种情况,但是您可以通过 AjaxOptions 手动将一个添加到每个请求中。您也可以研究将处理程序添加到 Sys.Net.WebRequestManager。

    【讨论】:

    • ajaxStart 听起来非常适合 jquery 条目。现在,如果只有 ms ajax 的东西有类似的东西
    • 你的第二条线索也解决了: Sys.Net.WebRequestManager.add_invokingRequest( function() { // 在每次 ajax 调用时都在此处执行操作} ); msdn.microsoft.com/en-us/library/bb397421.aspx
    【解决方案2】:

    基本上,这里的问题是默认行为返回一个登录页面。结果是一个200 OK,对于 jQuery 来说是一个成功的调用。更正对来自 MVC 的 ajax 调用的这种处理,你应该会很好。

    我认为处理此问题的最直接方法是更改​​ Authorize 在 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);
        }
    }
    

    【讨论】:

    • 是的,如果我们在开始开发时就意识到这一点,这将是理想的解决方案。
    【解决方案3】:

    我猜你应该在 jQuery Ajax 框架中为successbegin 创建默认处理函数,这取决于你希望何时发送通知......

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 2017-04-10
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2016-01-07
      • 2013-07-04
      相关资源
      最近更新 更多