在ajax调用C#mvc控制器不工作时处理会话超时
从ajax调用函数时。程序流无法识别过期会话,即无法重定向到登录页面。相反,它保存了记录。我在c#net mvc工作。那么,在ajax调用时如何处理会话呢。这是我的密码在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({
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;
...
...
...
}