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



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

相关内容

  • 没有找到相关文章

最新更新