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

.NET Core 7 Razor Pages本地化重定向异常及相关问题咨询

.NET Core 7 Razor Pages 本地化路由重定向问题解答

1. 解决routeData.Routers[0]的异常

异常根源是访问首页时,路由中间件尚未完成匹配,routeData.Routers集合为空。可以通过以下方式解决:

  • 调整中间件顺序:将自定义本地化重定向中间件放在app.UseRouting()之后、app.UseEndpoints()之前,确保路由数据已被正确解析,routeData.Routers会包含有效元素。
  • 增加空值校验:在访问routeData.Routers[0]前先判断集合是否有内容,避免索引越界:
    if (routeData.Routers.Any())
    {
        var router = routeData.Routers[0];
        // 后续业务逻辑
    }
    else
    {
        // 处理未匹配路由的场景,直接重定向到默认文化首页
        var defaultCulture = "zh-CN"; // 替换为你的默认文化标识
        context.Response.Redirect($"/{defaultCulture}/", permanent: true);
        return;
    }
    
  • 简化路径处理逻辑:无需直接操作Routers,可直接提取当前请求的路径和查询字符串,拼接默认文化前缀后执行重定向,跳过路由数据的依赖。

2. 中间件中可以使用301重定向

完全支持,有两种实现方式:

  • 使用框架自带的Redirect方法,设置permanent参数为true:
    var targetUrl = $"/{defaultCulture}{context.Request.Path}{context.Request.QueryString}";
    context.Response.Redirect(targetUrl, permanent: true);
    
  • 手动设置状态码和响应头:
    context.Response.StatusCode = StatusCodes.Status301MovedPermanently;
    context.Response.Headers.Location = $"/{defaultCulture}{context.Request.Path}{context.Request.QueryString}";
    

注意:301是永久重定向,浏览器会缓存规则,测试时需注意清除浏览器缓存。

3. 可以用UseRewriter实现相同目标

通过配置URL重写规则,无需自定义中间件即可完成需求。示例代码如下:

var defaultCulture = "zh-CN";
var validCultures = new[] { "zh-CN", "en-US" }; // 替换为你的有效文化列表

var rewriteOptions = new RewriteOptions();
rewriteOptions.Add(context =>
{
    var path = context.HttpContext.Request.Path.Value?.TrimStart('/') ?? string.Empty;
    var firstSegment = path.Split('/')[0];
    
    // 判断路径首段是否为有效文化,或路径为空(首页场景)
    if (string.IsNullOrEmpty(firstSegment) || !validCultures.Contains(firstSegment))
    {
        var newPath = $"/{defaultCulture}/{path}".Replace("//", "/"); // 处理首页空路径的格式问题
        var targetUrl = newPath + context.HttpContext.Request.QueryString;
        
        // 执行301重定向
        context.HttpContext.Response.StatusCode = StatusCodes.Status301MovedPermanently;
        context.HttpContext.Response.Headers.Location = targetUrl;
        context.Result = RuleResult.EndResponse;
    }
});

app.UseRewriter(rewriteOptions);

需将UseRewriter放在UseRouting之前,确保重写后的路径能被路由中间件正确解析。如果需要排除静态文件(如CSS、JS),可在规则中增加路径判断,跳过静态资源的重定向处理。

内容的提问来源于stack exchange,提问作者Miguel Moura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:40:38