То, что пытается сделать ваш AuthenticatedRoutes()
, - это построить маршрутизатор с промежуточным программным обеспечением, таким образом, мы можем использовать окончательно возвращенный IRouter как RouterMiddleware
для обработки запроса. Однако RouterMiddleware
никогда не продолжит маршрутизацию, если уже есть обработчик, соответствующий .В результате он не будет «отправлять» запросы от одного RouterMiddlware
к другому RouterMiddleware
автоматически.
Давайте рассмотрим ваш код:
app.UseRouter(AuthenticatedRoutes(app));
Как вы знаете, метод app.UseRouter()
здесь представляет собой метод расширения, который просто использует RouterMiddlware
.Итак, первый вопрос: как работает промежуточное ПО маршрутизатора?Давайте рассмотрим исходный код:
public class RouterMiddleware
{
private readonly IRouter _router;
// ...
public async Task Invoke(HttpContext httpContext)
{
var context = new RouteContext(httpContext);
context.RouteData.Routers.Add(_router);
await _router.RouteAsync(context);
if (context.Handler == null){
_logger.RequestDidNotMatchRoutes();
await _next.Invoke(httpContext);
} else {
httpContext.Features[typeof(IRoutingFeature)] = new RoutingFeature(){
RouteData = context.RouteData,
};
await context.Handler(context.HttpContext);
}
}
}
Как вы можете видеть здесь, RouterMiddleware
маршрутизирует контекст и проверяет, есть ли RouterHandler
соответствие:
- Еслиничего нет, ничего не делает, а затем отправляет запрос следующему промежуточному программному обеспечению .
- В противном случае обработайте запрос с помощью
RouterHandler
. Обратите внимание, что он никогда не отправит запрос следующему промежуточному программному обеспечению .
Давайте рассмотрим, как работает ваш маршрутизатор и RouterHandler
:
private IRouter AuthenticatedRoutes(IApplicationBuilder applicationBuilder)
{
IRouteBuilder builder = new RouteBuilder(applicationBuilder);
builder.MapMiddlewareGet("/api/values", appBuilder =>
{
appBuilder.UseMiddleware<AuthorizeMiddleware>(new AuthorizeOptions("User"));
appBuilder.UseMvc();
});
return builder.Build();
}
Видите это?Ваш маршрут проверит, является ли метод HTTP HttpGet
и может ли URL соответствовать /api/values
:
Если это так, это означает, что маршрут соответствует, и определенный RouterHandler
будет вызван для обработки запроса.
- Сначала
RouterHandler
будет вызывать промежуточное программное обеспечение AuthorizeMiddleware
- , если вы добавите
appBuilder.UseMvc();
, затем оно будет вызывать действие, соответствующее - , если
appBuilder.UseMvc();
нет, он прекратит дальнейшую обработку и, в конечном итоге, даст ответ 404
.
Если нет, это означает, что маршрутизатор здесь не соответствует, иничего не сделает, а затем отправит запрос следующему промежуточному программному обеспечению.