Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ajax调用C#mvc控制器不工作时处理会话超时_C#_Asp.net Mvc_Session Timeout - Fatal编程技术网

在ajax调用C#mvc控制器不工作时处理会话超时

在ajax调用C#mvc控制器不工作时处理会话超时,c#,asp.net-mvc,session-timeout,C#,Asp.net Mvc,Session Timeout,从ajax调用函数时。程序流无法识别过期会话,即无法重定向到登录页面。相反,它保存了记录。我在c#net mvc工作。那么,在ajax调用时如何处理会话呢。这是我的密码 $.ajax({ type: "POST", url:'/Employee/SaveEmployee', data: { Location:$("#txtLocation").val(),

从ajax调用函数时。程序流无法识别过期会话,即无法重定向到登录页面。相反,它保存了记录。我在c#net mvc工作。那么,在ajax调用时如何处理会话呢。这是我的密码

 $.ajax({ 
            type: "POST",
            url:'/Employee/SaveEmployee',
            data:
            {
                Location:$("#txtLocation").val(), 
                dateApplied:$("#txtDateApplied").val(), 
                Status:$("#ddStatus").val(), 
                mailCheck:$("#ddMailCheck").val(),
                ...
                ...
                ... 
            },
            success: function (result) 
            {

            },
            error: function (msg) 
            {
            }
      });
这里是控制器

[Authorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
      objEmpMain.FirstName = firstName;
      objEmpMain.LastName = lastName;
      objEmpMain.Initial = Initial;
      objEmpMain.Address1 = Address;
      ...
      ... 
      ...
} 

AJAX调用的结果很可能最终看起来是成功的(不过,别担心,它实际上不会执行动作方法),并调用
success
处理程序。这是因为您期望的是HTML,而这正是您所收到的(尽管结果HTML可能是您的登录页面,而不是您想要的HTML)。另一方面,如果您希望使用JSON(使用
数据类型:'JSON'
),它将触发一个错误,因为它将HTML解析为JSON

您需要做的是防止FormsAuth重定向AJAX请求的登录页面。现在,
authorizedResult
忠实地返回一个
NotAuthorizedResult
,它向客户端发送一个HTTP 401 Not AUTHRIZED响应,这非常适合您的AJAX客户端

问题是FormsAuth模块检查状态码,如果是401,则执行重定向。我以这种方式解决了这个问题:

1) 创建我自己的派生类型
AuthorizeAttribute
,在
HttpContext中放置一个标志。Items
让我知道授权失败,我应该强制401而不是重定向:

public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
    /// <summary>
    /// Processes HTTP requests that fail authorization.
    /// </summary>
    /// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param>
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true;

        base.HandleUnauthorizedRequest(filterContext);
    }
}
3) 将statusCode处理程序添加到jQuery AJAX设置中:

$.ajaxSetup({
    statusCode: {
        401: function() {
            window.location.href = "path/to/login";
        }
    }
});
4) 将需要此行为的控制器或操作从使用
AuthorizeAttribute
更改为
AjaxAuthorizeAttribute

[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
      objEmpMain.FirstName = firstName;
      objEmpMain.LastName = lastName;
      objEmpMain.Initial = Initial;
      objEmpMain.Address1 = Address;
      ...
      ... 
      ...
} 

我想建议您使用StatusCode=306。 我在使用401.IIS处理401时遇到了一些问题,这与我的理解不同。 306对我来说很好


尊敬。

实际上,我现在的班级看起来像是“公共班级雇员控制器:控制器”。您是否指示我更改如下“公共类AjaxAuthorizeAttribute:AuthorizeAttribute”??只需将您在控制器或控制器操作上修饰的
AjaxAuthorizeAttribute
替换为
AjaxAuthorizeAttribute
。请参阅我刚才添加的#4。对不起,您能解释一下我需要在哪里创建“public class AjaxAuthorizeAttribute:AuthorizeAttribute”类吗?关于您的信息,我已经处理了会话超时。但它适用于视图中的函数调用。但是只有ajax调用才是主要问题。@HackedByChinese-您的解决方案非常有效。下面是一个问题-为什么在应用程序_EndRequest中调用Context.Response.End()?
[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
      objEmpMain.FirstName = firstName;
      objEmpMain.LastName = lastName;
      objEmpMain.Initial = Initial;
      objEmpMain.Address1 = Address;
      ...
      ... 
      ...
}