You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:50:34