2017-09-16 1 views
0

Ich muss die eingehende Anfrage für eine Übereinstimmung mit dem regulären Ausdruck überprüfen. Wenn es zusammenfällt, dann benutze diese Route. Zu diesem Zweck Einschränkung. Aber mein Beispiel will nicht funktionieren. RouteBuilder benötigt einen Handler beim Deklarieren. Und der Handler fängt alle Anfragen ab und verursacht keine Einschränkungen.ASP.NET Core, wie überprüft man die Anfrage für eine Übereinstimmung mit einem regulären Ausdruck?

Bitte sagen Sie mir, wie Sie die eingehende Anfrage für eine Übereinstimmung mit einem regulären Ausdruck korrekt überprüfen?

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

Die Regex vereinfacht werden kann: @ ".^{0,} [0-9] - {0,} html $" -> @ ".^* \ D - * html $" Sehen die URLs wirklich so aus? example9-whatever.html . * entspricht einem beliebigen Zeichen (mit Ausnahme von Zeilenabschlüssen) zwischen null und unbegrenzten Zeiten \ d entspricht einer einzelnen Ziffer (entspricht [0-9]) - entspricht dem Zeichen - wörtlich Zeichen (außer Zeilenabschluss) zwischen null und unbegrenzten Zeiten html entspricht den Zeichen html wörtlich (Groß-/Kleinschreibung beachten) $ aktiviert Position am Ende der Zeichenfolge oder vor dem Zeilenabschluss rechts am Ende der Zeichenfolge (falls vorhanden) – wp78de

Antwort

1

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

Blättern Sie zum "MapWhen" Abschnitt - ich glaube, das Ihre Bedürfnisse anzupassen. Damit können Sie der Anwendung eine andere Pipeline folgen lassen, wenn die Anfrage bestimmten Parametern entspricht.

 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()); 
Verwandte Themen