如何在asp.net核心中编写中间件作为自定义路由器?
我想转换这段代码:
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/" matches // To match HTTP GET "hello//, // use routeBuilder.MapGet("hello/{*name}" return context.Response.WriteAsync($"Hi, {name}!"); }); var routes = routeBuilder.Build(); app.UseRouter(routes);
进入这个:
app.UseHelloRouter();
但我不想使用除路由之外的任何服务
您可以创建一个扩展方法来封装路由器配置
public static class HelloRouterExtensions { public static IApplicationBuilder UseHelloRouter(this IApplicationBuilder app) { 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/" matches // To match HTTP GET "hello/ / , // use routeBuilder.MapGet("hello/{*name}" return context.Response.WriteAsync($"Hi, {name}!"); }); var routes = routeBuilder.Build(); app.UseRouter(routes); return app; } }
这基本上改变了这种配置
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/" matches // To match HTTP GET "hello/ / , // use routeBuilder.MapGet("hello/{*name}" return context.Response.WriteAsync($"Hi, {name}!"); }); var routes = routeBuilder.Build(); app.UseRouter(routes); }
进入这个配置。
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { app.UseHelloRouter(); }
- 在ASP.NET Core Web API中注册新的DelegatingHandler
- 如何在ASP.NET Core中validationDI容器?
- asp.net 5中的Windows身份validation
- ASN.NET Core 2.0 Facebook身份validationExternalLoginSignInAsync失败(IsNotAllowed)
- entity framework核心:私有或受保护的导航属性
- 如何使用Swagger生成选项(CORS)
- 无法访问IIS 8上虚拟dotnet核心api应用程序下的虚拟目录
- 在ASP.NET Core中到达控制器之前拦截错误请求
- 从类型中获取DbSet