.NET Core 8.0路由优化:旧.aspx与废弃文件夹请求重定向咨询
推荐的.NET Core 8.0废弃文件夹重定向方案
针对你需要批量处理废弃文件夹重定向、避免重复路由规则的需求,以下是两种易维护的实现方案:
方案一:自定义路由约束(适合特定HTTP方法的重定向)
通过配置文件维护废弃文件夹列表,搭配自定义路由约束实现批量匹配,无需重复编写路由规则。
- 配置废弃文件夹列表
在appsettings.json中添加配置项,后续只需修改此文件即可更新废弃文件夹:
"RedirectSettings": { "AbandonedFolders": [ "old-docs", "archive-2022", "deprecated-api", "legacy-admin" ] }
- 实现自定义路由约束
创建约束类匹配配置中的废弃文件夹:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; public class AbandonedFolderConstraint : IRouteConstraint { private readonly HashSet<string> _abandonedFolders; public AbandonedFolderConstraint(IConfiguration configuration) { _abandonedFolders = new HashSet<string>( configuration.GetSection("RedirectSettings:AbandonedFolders").Get<string[]>() ?? Array.Empty<string>(), StringComparer.OrdinalIgnoreCase); } public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (values.TryGetValue(routeKey, out var value) && value is string folderName) { return _abandonedFolders.Contains(folderName); } return false; } }
- 注册约束并添加路由规则
在Program.cs中注册约束,然后添加一条通用路由规则:
// 注册自定义约束 builder.Services.AddRouting(options => { options.ConstraintMap.Add("abandoned-folder", typeof(AbandonedFolderConstraint)); }); // 添加重定向路由 app.Map("{folder:abandoned-folder}/{*rest}", (HttpContext context) => { // 替换为你的目标重定向URL,permanent设为true表示永久重定向(301) return Results.Redirect("/new-target-page", permanent: true); });
方案二:全局中间件(适合所有HTTP方法的重定向)
通过中间件拦截所有请求,检查请求路径是否命中废弃文件夹,灵活性更强,支持处理GET/POST等所有请求方法。
复用上述appsettings.json配置
实现重定向中间件
using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; public class AbandonedFolderRedirectMiddleware { private readonly RequestDelegate _next; private readonly HashSet<string> _abandonedFolders; public AbandonedFolderRedirectMiddleware(RequestDelegate next, IConfiguration configuration) { _next = next; _abandonedFolders = new HashSet<string>( configuration.GetSection("RedirectSettings:AbandonedFolders").Get<string[]>() ?? Array.Empty<string>(), StringComparer.OrdinalIgnoreCase); } public async Task InvokeAsync(HttpContext context) { var pathSegments = context.Request.Path.Value?.Split('/', StringSplitOptions.RemoveEmptyEntries); if (pathSegments != null && pathSegments.Length > 0 && _abandonedFolders.Contains(pathSegments[0])) { context.Response.Redirect("/new-target-page", permanent: true); return; } await _next(context); } }
- 注册中间件
在Program.cs中添加中间件(注意顺序要放在路由中间件之前):
app.UseMiddleware<AbandonedFolderRedirectMiddleware>(); app.UseRouting(); // 其他中间件及路由配置
方案对比
- 若只需处理GET请求,优先选择自定义路由约束,与现有路由体系融合更自然。
- 若需要拦截所有HTTP方法的请求,或者需要更复杂的路径校验逻辑,选择全局中间件更合适。
- 两种方案均通过配置文件维护废弃列表,后续更新无需修改业务代码,维护成本极低。
内容的提问来源于stack exchange,提问作者Rajiv Ranjan
相关产品推荐
相关产品推荐

