2016-05-23 13 views
1

Ich versuche 301 eine ältere URL mit einer Middleware umzuleiten.ASP.NET Core RC1 MVC 6 - Wie auf UrlHelper von Middleware zugreifen und Url zu Aktion erstellen

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); 
     }); 
    }); 
} 

Wie Sie lesen können, verwende ich die MapWhen Methode, die ich in der Methode RedirectFromPost instanziiert meine IUrlHelper Instanz beschränken. Der ServiceProvider gibt mir eine leere Instanz, ohne den ActionContext, um IUrlHelper.Action() zu verwenden.

Hatte jemand eine ähnliche Herausforderung und einen Einblick für mich?

Antwort

2

Nach der Reflexion, da die Middleware vor MVC ausgeführt wird, kann der ActionContext nicht erstellt werden, da er einfach nicht existiert.

Der richtige Weg wäre also, wenn Sie wirklich UrlHelper.Action verwenden möchten, um Ihre URL zu erstellen, um einen ActionFilter oder eine dedizierte Aktion mit dem Legacy-URL-Muster zu erstellen.