导航

09-012 Routing 之 RouteMiddleware

Posted on 2015-04-09 13:05  DotNet1010  阅读(166)  评论(0)    收藏  举报

使用方法:

  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);
                    }
                }
            }
        }
    }