使用asp.net mvc / jquery进行全局“ajax调用”通知

时间:2010-05-12 16:40:24

标签: asp.net-mvc ajax jquery

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:4)

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

您可以在我的博客code上找到http://farm-fresh-code.blogspot.com现在它没有考虑可能会更新会话的AJAX操作,但您可以通过全局ajaxStart重新设置计时器以便jQuery AJAX。它使用ajaxStart在发出jQuery AJAX请求时重置计时器。我不太使用MS AJAX所以我不确定你是否可以使用全局钩子。检查代码时看起来不是这样,但您可以通过AjaxOptions手动为每个请求添加一个代码。您也可以调查向Sys.Net.WebRequestManager添加处理程序。

答案 1 :(得分:4)

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

我认为最直接的处理方法是改变授权方式适用于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);
    }
}

答案 2 :(得分:0)

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