ActionFilter 不适用于 AJAX 调用
Posted
技术标签:
【中文标题】ActionFilter 不适用于 AJAX 调用【英文标题】:ActionFilter is not working with AJAX call 【发布时间】:2021-08-13 02:15:23 【问题描述】:我有一个对 DataTable 的 AJAX 调用,该调用在我的控制器中调用一个返回类型为 JsonResult 的方法。如果用户的会话已过期,我会收到 JSON 错误警报,并且网站会挂起。我正在尝试使用 ActionFilter 在处理请求之前检查用户的会话是否已过期。它在方法返回类型为 ActionResult 时起作用。但是,当返回类型为 JsonResult 时,我看到错误并挂起。跟踪时,我看到正在调用 ActionFilter 并且代码工作正常,但它不会像应有的那样将用户重定向到登录页面。有没有办法在服务器端中止 AJAX 调用并按预期重定向用户?
动作过滤器
public override void OnActionExecuting(ActionExecutingContext filterContext)
HttpContext ctx = HttpContext.Current;
if (ctx.Session != null)
if (ctx.Session.IsNewSession)
string cookieHeaders = ctx.Request.Headers["Cookie"];
if ((null != cookieHeaders) && (cookieHeaders.IndexOf("ASP.NET_SessionId") >= 0))
filterContext.Result = new RedirectResult("~/Account/Login");
return;
base.OnActionExecuting(filterContext);
【问题讨论】:
【参考方案1】:我们可以检查请求是否是 Ajax 然后返回 json 结果并在客户端检查服务器是否返回错误重定向到登录页面,如:
if ((null != cookieHeaders) && (cookieHeaders.IndexOf("ASP.NET_SessionId") >= 0))
if (filterContext.HttpContext.Request.IsAjaxRequest())
filterContext.Result = new JsonResult
Data = new Error = "UnAutorized", Url = Url.Action("Login","Account"),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
;
return;
else
filterContext.Result = new RedirectResult("~/Account/Login");
return;
现在对于正常请求,它将重定向到登录页面,对于 ajax 调用,将重新发送带有未经授权的错误消息和 URL 的 json 响应,然后在客户端我们可以像这样重定向:
window.location.href = response.Url;
【讨论】:
我不知道有一个 IsAjaxRequest 方法!我稍微调整了 JsonResult,但这解决了我的问题!非常感谢Ehsan!我已经解决这个问题两天了。以上是关于ActionFilter 不适用于 AJAX 调用的主要内容,如果未能解决你的问题,请参考以下文章