Asp.net web api 如何在MVC内核中获得对API控制器路由的更多控制?

Asp.net web api 如何在MVC内核中获得对API控制器路由的更多控制?,asp.net-web-api,asp.net-core-mvc,asp.net-core-routing,Asp.net Web Api,Asp.net Core Mvc,Asp.net Core Routing,在旧的Web API 2中,我们通常在WebApi.config中设置路由,如下所示: Map(routes, "MyNamedRoute", "{controller}/custom/preview", new {action = "PreviewSomthing"}); 因此,路由将转到URL第一段中命名的控制器,然后转到PreviewSomething操作,或者没有默认操作,然后是与HTTP谓词匹配的方法名称,或者是具有与请求的HTTP谓词匹配的属性的方法 现在在

在旧的Web API 2中,我们通常在WebApi.config中设置路由,如下所示:

Map(routes, "MyNamedRoute", "{controller}/custom/preview",
            new {action = "PreviewSomthing"});
因此,路由将转到URL第一段中命名的控制器,然后转到PreviewSomething操作,或者没有默认操作,然后是与HTTP谓词匹配的方法名称,或者是具有与请求的HTTP谓词匹配的属性的方法

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

app.UseMvc(routes =>
        {
            routes.MapRoute(
               name: "default",
               template: "{controller=Home}/{action=Index}/{id?}");
        });
对于纯MVC类型路由,混合Web API控制器的属性路由

现在这被认为是最佳实践吗? 我更喜欢更多的控制来定义我的路线。这样看来,它们更易于测试。除非某个地方仍然有一个routes集合对象,否则我们仍然可以访问测试路由

在本文中: 有一个章节叫做“使用路由中间件”

你需要:

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);
}
public void配置(IApplicationBuilder应用程序,ILoggerFactory loggerFactory)
{
var trackPackageRouteHandler=newroutehandler(上下文=>
{
var routeValues=context.GetRouteData().Values;
返回context.Response.WriteAsync(
$“你好!路由值:{string.Join(“,”,routeValue)}”);
});
var routeBuilder=新routeBuilder(应用程序,trackPackageRouteHandler);
routeBuilder.MapRoute(
“追踪包裹路线”,
“包/{operation:regex(^track | create | restrict$)}/{id:int}”);
MapGet(“hello/{name}”,上下文=>
{
var name=context.GetRouteValue(“名称”);
//这是HTTP GET“hello/”匹配时的路由处理程序
//要匹配HTTP,请获取“hello/”,
//使用routeBuilder.MapGet(“hello/{*name}”
返回context.Response.WriteAsync($“Hi,{name}!”);
});
var routes=routeBuilder.Build();
app.UseRouter(路由);
}
这个例子非常复杂和抽象,对我很有用。 但它应该支持以下方法: 马普杰 和 地图柱

属性路由是现在更被接受的方式吗?
这是最标准的方法吗?

是的,一般建议对WebAPI使用属性路由。但是,如果您喜欢,您可以完全使用MVC样式的路由。您突出显示的两种技术之间的区别只是一种新的速记语法

你打字的时候

"{Controller=Foo}/..."
您只需指定默认值

新系统实际上比WebAPI2灵活得多,如果您愿意,您可以构建更复杂的方案。如果您没有充分的理由,您可能希望使用内置支持

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

以下是一些高级/自定义路由示例:

最后是一个完整的重做MVC是如何工作的南希风格,与现有的路由并排。我不认为这是一个建议,但更多的是一种方式来显示系统的灵活性和它可以带你走多远