2017-09-16 3 views
0

Je dois vérifier la requête entrante pour une correspondance avec l'expression régulière. Si cela coïncide, utilisez cette route. À cette fin Contrainte. Mais mon exemple ne veut pas travailler. RouteBuilder requiert un gestionnaire lors de la déclaration. Et le gestionnaire intercepte toutes les demandes et ne provoque pas de contraintes.ASP.NET Core, comment vérifier la requête pour une correspondance avec une expression régulière?

S'il vous plaît dites-moi comment vérifier correctement la demande entrante pour une correspondance avec une expression régulière?

configure

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
     app.UseBrowserLink(); 
    } 
    else 
    { 
     app.UseExceptionHandler("/Home/Error"); 
    } 

    app.UseStaticFiles(); 
    app.UseAuthentication(); 

    var trackPackageRouteHandler = new RouteHandler(Handle); 
    var routeBuilder = new RouteBuilder(app); 
    routeBuilder.MapRoute(
     name: "old-navigation", 
     template: "{*url}", 
     defaults: new { controller = "Home", action = "PostPage" }, 
     constraints: new StaticPageConstraint(), 
     dataTokens: new { url = "^.{0,}[0-9]-.{0,}html$" }); 

    routeBuilder.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 

    app.UseRouter(routeBuilder.Build()); 

    app.UseMvc(); 
} 

// собственно обработчик маршрута 
private async Task Handle(HttpContext context) 
{ 
    await context.Response.WriteAsync("Hello ASP.NET Core!"); 
} 

IRouteConstraint

public class StaticPageConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     string url = httpContext.Request.Path.Value; 
     if(Regex.IsMatch(url, @"^.{0,}[0-9]-.{0,}html$")) 
     { 
      return true; 
     } else 
     { 
      return false; 
     } 
     throw new NotImplementedException(); 
    } 
} 
+0

Le regex peut être simplifié: @ ".^{0,} [0-9] - {0,} $ html" -> @ ".^* \ D - * $ html" Est-ce vraiment la façon dont les URL ressemblent? exemple9-quel.html . * correspond à n'importe quel caractère (sauf pour les terminaisons de ligne) entre 0 et \ d correspond à un seul chiffre (égal à [0-9]) - correspond au caractère - littéralement . html correspond littéralement aux caractères html (sensible à la casse) $ assert la position à la fin de la chaîne, ou avant la fin de la ligne juste à la fin de la chaîne (le cas échéant) – wp78de

Répondre

1

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware

Faites défiler jusqu'à la section "MapWhen" - Je crois que cela répondra à vos besoins. En utilisant ceci, vous pouvez faire en sorte que l'application suive un pipeline différent lorsque la requête correspond à certains paramètres.

 app.MapWhen(
      context => ... // <-- Check Regex Pattern against Context 
      branch => branch.UseStatusCodePagesWithReExecute("~/Error") 
      .UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "default", 
        template: "{controller=SecondController}/{action=Index}/{id?}") 
      }) 
      .UseStaticFiles());