【发布时间】:2017-02-07 21:11:17
【问题描述】:
在旧的 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 控制器的属性路由混合。
现在这是否被认为是最佳做法? 我更喜欢实际定义我的路线的更多控制。看起来他们会更容易测试。除非某处仍有路由集合对象,否则我们仍然可以访问测试路由。
在这篇文章中: 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);
}
这个例子真的很复杂和抽象,对我有用。 但它应该支持以下方法: 地图获取 和 地图邮政
现在属性路由是更被接受的方式吗? 这是最标准的方式吗?
【问题讨论】:
标签: asp.net-web-api asp.net-core-mvc asp.net-core-routing