Asp.net mvc “全球”;ajax调用";使用asp.net mvc/jquery发出通知

Asp.net mvc “全球”;ajax调用";使用asp.net mvc/jquery发出通知,asp.net-mvc,ajax,jquery,Asp.net Mvc,Ajax,Jquery,每当大型asp.net mvc web应用程序向服务器发出ajax调用时,我都需要得到通知。我们同时使用jquery和内置的Ajax.*方法来进行远程调用,我希望能够以一种全局方式知道何时进行调用,而无需手动向每个请求注入某种“IsMakingCall”方法 我们试图解决的根本问题是会话超时。例如,如果用户离开一个页面去吃午饭,那么当他们回来时会出现错误,因为ajax调用返回的是登录页面,而不是预期的json或部分html结果 我的想法是有一个js计时器,它可以在我们进行ajax调用时重置。这样

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

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

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


谢谢

我想您应该为jQuery Ajax框架中的
success
begin
创建默认处理函数,具体取决于您希望何时发送通知…

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


你可以在我的博客上找到。现在,它没有考虑到可能会更新会话的AJAX操作,但是您可以对其进行检测,以便jQueryAjax通过全局ajaxStart重置计时器。它用于在发出jQuery AJAX请求时重置计时器。我不太使用MS-AJAX,所以我不确定是否有可以使用的全局钩子。检查代码时,情况并非如此,但您可以通过AjaxOptions手动向每个请求添加一个。您也可以研究向Sys.Net.WebRequestManager添加处理程序。

基本上,这里的问题是默认行为返回登录页面。其结果是一个
200ok
,对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);
    }
}

ajaxStart听起来非常适合jquery条目。现在,如果ms ajax stuff也有类似的东西,那么您的第二条线索也就解决了:Sys.Net.WebRequestManager.add_invokingRequest(function(){//do stuff in here on every ajax call});是的,如果我们在开始开发时意识到这一点,这将是理想的解决方案。