如何在OnActionExecuting中设置条件避免无限重定向循环?
避免全局过滤器无限重定向循环的解决方案
要解决无限重定向问题,核心思路是在过滤器中判断当前请求是否已经是目标页面,如果是则直接返回,不再执行重定向逻辑。以下是两种适配你场景的实现方案:
方案1:基于路由参数判断(推荐,适配RedirectToRouteResult)
如果你的路由配置包含language、controller、action参数(比如本地化路由),可以直接从RouteData中读取当前请求的路由信息,判断是否已到达目标页面:
public void OnActionExecuting(ActionExecutingContext context) { // 提取当前请求的路由参数 var currentController = context.RouteData.Values["controller"]?.ToString() ?? string.Empty; var currentAction = context.RouteData.Values["action"]?.ToString() ?? string.Empty; var currentLanguage = context.RouteData.Values["language"]?.ToString() ?? string.Empty; // 条件:如果当前已是Home控制器的Index动作,且语言匹配目标值,直接返回 if (currentController.Equals("Home", StringComparison.OrdinalIgnoreCase) && currentAction.Equals("Index", StringComparison.OrdinalIgnoreCase) && (currentLanguage == "en-us" || currentLanguage == "es-mx")) { return; } if (context.HttpContext.Request.Cookies["localization"] != null) { var isoCode = context.HttpContext.Request.Cookies["localization"]; string targetController = "Home"; string targetAction = "Index"; if (isoCode == "en-us") { context.Result = new RedirectToRouteResult( new RouteValueDictionary(new { language = "en-us", controller = targetController, action = targetAction }) ); } else if (isoCode == "es-mx") { context.Result = new RedirectToRouteResult( new RouteValueDictionary(new { language = "es-mx", controller = targetController, action = targetAction }) ); } } }
配套路由配置
确保你的Startup/Program中配置了支持语言前缀的路由:
app.MapControllerRoute( name: "localized", pattern: "{language}/{controller=Home}/{action=Index}/{id?}");
方案2:基于请求路径前缀判断(适合无路由参数场景)
如果你的路由没有绑定language参数,直接通过URL路径前缀判断:
public void OnActionExecuting(ActionExecutingContext context) { var requestPath = context.HttpContext.Request.Path.Value.ToLower(); // 条件:如果当前请求路径已是目标语言页面,直接返回 if (requestPath.StartsWith("/en-us/home") || requestPath.StartsWith("/es-mx/casa")) { return; } if (context.HttpContext.Request.Cookies["localization"] != null) { var isoCode = context.HttpContext.Request.Cookies["localization"]; string targetController = "Home"; string targetAction = "Index"; if (isoCode == "en-us") { context.Result = new RedirectToRouteResult( new RouteValueDictionary(new { controller = targetController, action = targetAction }) ); // 若需手动拼接路径,可改用RedirectResult: // context.Result = new RedirectResult("/en-us/home"); } else if (isoCode == "es-mx") { context.Result = new RedirectToRouteResult( new RouteValueDictionary(new { controller = targetController, action = targetAction }) ); // context.Result = new RedirectResult("/es-mx/casa"); } } }
核心原理
两种方案都是通过提前终止过滤器逻辑,避免对已经到达目标页面的请求再次执行重定向,从根源上切断循环链。
内容的提问来源于stack exchange,提问作者PussInBoots
相关产品推荐
相关产品推荐

