在ASP.NET Core中,路由是定义URL模式与应用程序中控制器操作之间映射关系的机制。通过路由,用户可以请求特定的URL,并由路由系统解析该URL,将其映射到相应的控制器和动作方法上,从而执行相应的业务逻辑。
ASP.NET Core的路由系统基于中间件模型。当HTTP请求到达服务器时,路由中间件会首先检查请求的URL,并尝试将其与定义的路由模式进行匹配。如果找到匹配的路由,则会创建并返回相应的HTTP响应。
路由模式通常包含URL路径和可选的查询参数。例如,`{controller=Home}/{action=Index}/{id?}`是一个常见的默认路由模式,其中`{controller}`、`{action}`和`{id}`是路由参数。
在ASP.NET CoreMVC应用程序中,通常会在`Startup.cs`文件的`Configure`方法中配置默认路由。例如:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
这段代码定义了一个名为`default`的路由,它使用默认的控制器(`Home`)、动作(`Index`)和可选的`id`参数。
除了使用默认路由外,ASP.NET Core还支持自定义路由,以满足特定需求。自定义路由可以通过在控制器或动作方法上使用特性(Attribute)来实现。
特性路由(Attribute Routing)允许直接在控制器或动作方法上使用`[Route]`特性来定义路由模式。例如:
[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult GetProductById(int id)
{
// 业务逻辑
return Ok(new { Id = id, Name = "Product Name" });
}
}
在这个例子中,`ProductsController`控制器被配置为响应以`Products`为路径的HTTP请求。`GetProductById`动作方法被配置为响应带有`{id}`参数的GET请求。
对于更复杂的路由需求,可以实现`IRouter`接口来自定义路由逻辑。下面是一个简单的示例:
public class CustomRouter : IRouter
{
public VirtualPathData GetVirtualPath(HttpContext context, RouteValueDictionary values)
{
// 实现自定义虚拟路径逻辑
return null;
}
public Task RouteAsync(HttpContext context)
{
var request = context.Request;
if (request.Path.Value.StartsWith("/custom"))
{
var routeContext = new RouteContext(context);
routeContext.RouteData.Values["controller"] = "Custom";
routeContext.RouteData.Values["action"] = "Index";
context.Handler = new CustomRouteHandler(routeContext.RouteData);
}
else
{
return Task.FromResult(false);
}
return Task.CompletedTask;
}
}
public class CustomRouteHandler : RequestDelegate
{
private readonly RouteData _routeData;
public CustomRouteHandler(RouteData routeData)
{
_routeData = routeData;
}
public override async Task InvokeAsync(HttpContext context)
{
var controller = context.RequestServices.GetRequiredService().CreateController(context, _routeData["controller"].ToString());
var controllerContext = new ControllerContext(context, new RouteData(), controller);
var action = ((ControllerBase)controller).FindAction(_routeData, context.Request.Method);
if (action != null)
{
await action.InvokeAsync();
}
else
{
context.Response.StatusCode = 404;
}
}
}
在`Startup.cs`中注册自定义路由:
app.UseRouter(new CustomRouter());
ASP.NET Core中的路由机制为开发者提供了灵活且强大的URL映射能力。通过了解路由的基本概念、工作原理以及自定义路由的实现方法,开发者可以更好地设计和实现应用程序中的URL路由策略。