ASP.NET Core RC1 MVC 6 - 如何从中间件访问 UrlHelper 并创建 Url 到 Action

ASP.NET Core RC1 MVC 6 - How to access UrlHelper From Middleware and create Url to Action

我正在尝试使用中间件重定向 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 或一个专用的 Action。