1

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

有没有人遇到过类似的挑战并对我有见识?

4

1 回答 1

2

经过反思,由于中间件是在MVC之前执行的,所以ActionContext根本不存在,所以无法创建。

因此,如果您真的想使用 UrlHelper.Action 创建您的 URL,那么正确的方法是使用旧版 url 模式创建一个 ActionFilter 或专用 Action。

于 2016-05-23T15:47:00.523 回答