使用方法:
public static class BuilderExtensions
{
public static IApplicationBuilder UseRouter([NotNull] this IApplicationBuilder builder, [NotNull] IRouter router)
{
return builder.UseMiddleware<RouterMiddleware>(router);
}
}
具体代码:
public class RouterMiddleware
{
private readonly ILogger _logger;
private readonly RequestDelegate _next;
private readonly IRouter _router;
private readonly IServiceProvider _services;
/// <summary>
/// IRouter 是外部传进来的 RouterBuilder.Build() 实际是 RouteCollection
/// </summary>
public RouterMiddleware(
RequestDelegate next,
IServiceProvider services,
ILoggerFactory loggerFactory,
IRouter router)
{
_next = next;
_services = services;
_router = router;
_logger = loggerFactory.Create<RouterMiddleware>();
}
public async Task Invoke(HttpContext httpContext)
{
// 这里实现了 LifeKind.Scoped
using (RequestServicesContainer.EnsureRequestServices(httpContext, _services))
{
using (_logger.BeginScope("RouterMiddleware.Invoke"))
{
var context = new RouteContext(httpContext);
// _router 是 RouteCollection
context.RouteData.Routers.Add(_router);
//循环调用
await _router.RouteAsync(context);
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteValues(new RouterMiddlewareInvokeValues() { Handled = context.IsHandled });
}
if (!context.IsHandled)
{
//路由失败 应该是返回 404 错误
await _next.Invoke(httpContext);
}
}
}
}
}
浙公网安备 33010602011771号