Как мой Middleware будет работать в конвейере? - PullRequest
0 голосов
/ 11 ноября 2018

В настоящее время я очень и очень новичок в .NET Core (и во всем, что связано с .NET в целом). Я изучаю онлайн-курс по Pluralsight, и до сих пор мы разработали следующий метод:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IGreeter greeter, ILogger<Startup> logger)
        {
            app.Use(next =>
            {
            return async context =>
                {
                    logger.LogInformation("Request Incoming");
                    if (context.Request.Path.StartsWithSegments("/my"))
                    {
                        logger.LogInformation("Inside first Middleware!");
                        await context.Response.WriteAsync("Inside first Middleware");
                    }
                    else
                    {
                        logger.LogInformation("Request going to next Middleware");
                        //await next(context);
                    }
                };
            });

            app.UseWelcomePage(new WelcomePageOptions
            {
                Path = "/wp"
            });

            app.Run(async (context) =>
            {
                var greeting = greeter.getMessageOfTheDay();
                await context.Response.WriteAsync(greeting);
            });
        }

Я немного запутался в том, как работает конвейер в определенных сценариях.

Например, если я должен был удалить первое промежуточное программное обеспечение, являющееся app.use, и app.UseWelcomePage становится первым промежуточным программным обеспечением. Как app.usewelcomepage вызовет следующее промежуточное программное обеспечение app.run, если путь не удовлетворен? Я предполагал, что нам всегда нужен await.next ()? В моем случае app.run будет выполняться.

Что касается моего второго вопроса, с приведенным ниже кодом, когда я закомментировал await.next () в первом Middleware, когда я запускаю IISExpress, браузер загружается и думает о том, что делать. На вкладке для заголовка кратко отображается заголовок из UseWelcomePage. Как это возможно, если нет ссылки?

1 Ответ

0 голосов
/ 12 ноября 2018

Как app.usewelcomepage вызовет следующее промежуточное программное обеспечение app.run, если путь не будет удовлетворен?Я предположил, что мы всегда нуждались в await.next ()?

Да, нам нужен await next(). Но await next() уже добавлено в WelcomePageMiddleware.Для получения дополнительной информации см. Исходный код WelcomePageMiddlewareapp.UseWelcomePage(...) здесь - не более чем метод расширения, который в конечном итоге вызывает промежуточное ПО:

return app.UseMiddleware<WelcomePageMiddleware>(Options.Create(options));

Ответственность за вызов next лежит на промежуточном ПО, а не на методе расширения.

Как примечание, как правило, существует 4 вида промежуточного программного обеспечения:

  1. raw style: next => context => { /* ... */ }
  2. inline-style: (context,next)=>{ /* ... */ })
  3. промежуточное программное обеспечение на фабрике: класс, унаследованный от интерфейса IMiddleware.
  4. промежуточное ПО по соглашению: класс без интерфейса.

Внутри этих промежуточных программ, мы вызываем await next() или await next(context) для вызова следующего промежуточного программного обеспечения.При использовании с 1-м стилем, 3-м стилем и 4-м стилем промежуточного программного обеспечения мы должны использовать await next(context) вместо await next().

с приведенным ниже кодом, поскольку я закомментировалawait.next () в первом Middleware, где я запускаю IISExpress, браузер загружается и думает о том, что делать.На вкладке для заголовка кратко отображается заголовок из UseWelcomePage.Как это возможно, если нет ссылки?

Не уверен, что вы имеете в виду "если ссылки нет".Однако, если вы прокомментируете строку await next(context) в первом промежуточном программном обеспечении, второе и третье промежуточное программное обеспечение никогда не получат изменения для обработки запроса.Если вы уже отобразили WelcomePage в вашем браузере до того, как закомментировали await next(context), а затем закомментировали первый await next(context), браузер зависнет на несколько секунд без изменения названия, но если вы будете ждать достаточно времени, выВы получите что-то вроде <title>Can't reach this page</title> или пустой заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...