Метод расширения «Use» в приложении IAppBuilder имеет следующую подпись - public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware)
Это означает, что он принимает делегат Fun c, который принимает первый аргумент в качестве объекта контекста, второй - асинхронное лямбда-выражение и возвращает задача. В официальном документе говорится, что Fun c должен быть делегатом запроса (следующий), и мы ожидаем, что в текущем вызове делегата будет вызван другой компонент промежуточного программного обеспечения. Я сделал что-то вроде этого.
app.Use(async (context, temp) =>
{
await temp();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
, где temp =
public Func<Task> temp = async () =>
{
Debug.WriteLine("In temporary task method");
await Task.Delay(1000);
};
и практически ничего не делает, чем спать в течение 1 секунды. Я также не называю следующую часть промежуточного программного обеспечения, которая записывает ответ.
Я ожидал, что этот код взломает sh, но он отправил ответ Hello World.
Вопрос - как вызывался следующий кусок промежуточного программного обеспечения, если он не был явно вызван во временном делегате, который я передал? Обычно мы передаем next, который является делегатом запроса, принимающим следующий кусок промежуточного программного обеспечения, и делаем await next (); явно вызывать следующее в цепочке.
Я понимаю, что что-то упускаю из концепции того, как эти промежуточные программы работают на практике.