我正在尝试使用中间件重定向 301 旧版 URL。
private static Boolean IsLegacyPathToPost(this HttpContext context)
{
return context.IsLegacyPath() && context.Request.Path.Value.Contains("/archives/");
}
public static void HandleLegacyRoutingMiddleware(this IApplicationBuilder builder)
{
builder.MapWhen(context => context.IsLegacyPathToPost(), RedirectFromPost);
}
private static void RedirectFromPost(IApplicationBuilder builder)
{
builder.Run(async context =>
{
await Task.Run(() =>
{
//urlHelper is instanciated but it's ActionContext is null
IUrlHelper urlHelper = context.RequestServices.GetService(typeof(IUrlHelper)) as IUrlHelper;
IBlogContext blogContext = context.RequestServices.GetService(typeof(IBlogContext)) as IBlogContext;
//Extract key
var sections = context.Request.Path.Value.Split('/').ToList();
var archives = sections.IndexOf("archives");
var postEscapedTitle = sections[archives + 1];
//Query categoryCode from postEscapedTitle
var query = new GetPostsQuery(blogContext).ByEscapedTitle(postEscapedTitle).WithCategory().Build();
var categoryCode = query.Single().Categories.First().Code;
//Redirect
context.Response.Redirect(urlHelper.Action("Index", "Posts", new { postEscapedTitle = postEscapedTitle, categoryCode = categoryCode }), true);
});
});
}
正如你所读到的,我正在使用 MapWhen 方法,它限制了我在 RedirectFromPost 方法中实例化我的 IUrlHelper 实例。ServiceProvider 给了我一个空实例,没有正确使用 IUrlHelper.Action() 所需的 ActionContext。
有没有人遇到过类似的挑战,对我有洞察力?
在反射之后,由于中间件是在 MVC 之前执行的,因此无法创建 ActionContext,因为它根本不存在。
因此,如果您真的想使用 UrlHelper.Action 来创建您的 URL,那么正确的方法是使用旧版 url 模式创建 ActionFilter 或专用操作。