如何在MVC Core中获得对API控制器路由的更多控制?

时间:2017-02-07 21:11:18

标签: 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的第一个段中命名的Controller,然后转到PreviewSomething操作或没有默​​认操作,然后是与HTTP谓词匹配的方法名称或具有与HTTP动词匹配的属性的方法请求。

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

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

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

1 个答案:

答案 0 :(得分:0)

是的,一般建议是使用WebAPI的属性路由。但是,如果这是您的偏好,您可以完全使用MVC样式路线。您突出显示的两种技术之间的差异只是一种新的简写语法

键入

"{Controller=Foo}/..."

您只需指定默认值。

新系统实际上比WebAPI2更灵活,如果您选择,您可以构建更复杂的方案。如果你没有充分的理由,你可能想要使用内置的支持。

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

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

Custom routing conventions

Custom routing sample

Nancy style routing inside MVC

最后重新介绍了MVC如何使用Nancy样式,与现有路由并排。我不会将此作为推荐,但更多的方式来展示系统的灵活性以及它可以带你走多远。

Translate API Reference