Asp.net web api 如何在MVC内核中获得对API控制器路由的更多控制?
在旧的Web API 2中,我们通常在WebApi.config中设置路由,如下所示: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谓词匹配的属性的方法 现在在
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是如何工作的南希风格,与现有的路由并排。我不认为这是一个建议,但更多的是一种方式来显示系统的灵活性和它可以带你走多远