2017-02-07 113 views
2

在旧的Web API 2,我们用来建立路由在WebApi.config这样的:如何获得对MVC Core中的API控制器路由的更多控制?

Map(routes, "MyNamedRoute", "{controller}/custom/preview", 
      new {action = "PreviewSomthing"}); 

所以路线会去在URL中的第一段,然后到PreviewSomething行动或命名控制器如果没有缺省操作,那么将匹配HTTP动词的方法名称或匹配请求HTTP动词的属性的方法。

现在在ASP.Net MVC核心,每个人似乎都使用:

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

与属性路由的Web API控制器混合纯MVC型路线。

现在认为这是最佳做法吗? 我更喜欢实际定义我的路线的更多控制。看起来他们会更加可测试。除非仍然有某个路由集合对象,否则我们仍然可以访问测试路由。

本文内容: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing 有一节叫做“使用路由中间件”。

您需要:

services.AddRouting() 

在startup.cs

下面的配置是他们给出的例子:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) 
{ 
    var trackPackageRouteHandler = new RouteHandler(context => 
    { 
     var routeValues = context.GetRouteData().Values; 
     return context.Response.WriteAsync(
      $"Hello! Route values: {string.Join(", ", routeValues)}"); 
    }); 

    var routeBuilder = new RouteBuilder(app, trackPackageRouteHandler); 

    routeBuilder.MapRoute(
     "Track Package Route", 
     "package/{operation:regex(^track|create|detonate$)}/{id:int}"); 

    routeBuilder.MapGet("hello/{name}", context => 
    { 
     var name = context.GetRouteValue("name"); 
     // This is the route handler when HTTP GET "hello/<anything>" matches 
     // To match HTTP GET "hello/<anything>/<anything>, 
     // use routeBuilder.MapGet("hello/{*name}" 
     return context.Response.WriteAsync($"Hi, {name}!"); 
    }); 

    var routes = routeBuilder.Build(); 
    app.UseRouter(routes); 
} 

这个例子实在是复杂和抽象,是有益的我。 但它应该支持这样的方法: MapGet 和 MapPost

是属性路由现在更易于接受的方式? 它是最标准的方式吗?

回答

0

是的,一般建议是使用WebAPI的属性路由。但是,如果这是您的偏好,则可以完全使用MVC样式路线。这两种技术你突出的区别只是一个新的语法速记

当你键入

"{Controller=Foo}/..." 

您刚才指定的默认值。

新系统实际上比WebAPI2更灵活,如果您愿意,可以构建更复杂的方案。如果你没有很强的理由,你可能想要支持内置。

最后,不是迭代MVC和WebAPI这样的路由列表,现在有一种更高效的树结构路由算法,当路由数量很大时(logN而不是N),使得路由LOT更便宜。 。您将注意到UseMVC的签名公开了一个routebuilder而不是一个routecollection,目的是从配置时间抽象出实际的底层运行时路由机制。

这里有先进/自定义路由的几样:

Using Action Constraints

Custom routing conventions

Custom routing sample

去年的MVC是如何工作的南希风格,并排着一个完整的重做现有路由。我不会认为这是一个建议,但更多的是展示系统的灵活性以及它可以带给您多远。

Nancy style routing inside MVC