在旧的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
属性路由现在是更可接受的方式吗? 这是最标准的方式吗?
答案 0 :(得分:0)
是的,一般建议是使用WebAPI的属性路由。但是,如果这是您的偏好,您可以完全使用MVC样式路线。您突出显示的两种技术之间的差异只是一种新的简写语法
键入
时"{Controller=Foo}/..."
您只需指定默认值。
新系统实际上比WebAPI2更灵活,如果您选择,您可以构建更复杂的方案。如果你没有充分的理由,你可能想要使用内置的支持。
最后,不是迭代像MVC和WebAPI这样的路由列表,而是现在有一种更有效的树结构路由算法,当路由数量很大(logN而不是N)时,这使得路由更便宜。您将注意到UseMVC的签名公开了routebuilder而不是routecollection,以便从配置时抽象出实际的底层运行时路由机制。
以下是一些高级/自定义路由示例:
Nancy style routing inside MVC
最后重新介绍了MVC如何使用Nancy样式,与现有路由并排。我不会将此作为推荐,但更多的方式来展示系统的灵活性以及它可以带你走多远。