Ćwiczenie — tworzenie niestandardowego oprogramowania pośredniczącego

Ukończone

Deweloperzy mogą tworzyć niestandardowe składniki oprogramowania pośredniczącego, aby dodać funkcje do aplikacji ASP.NET Core. Niestandardowe oprogramowanie pośredniczące można wstawić w dowolnym miejscu w potoku oprogramowania pośredniczącego i może być używane z wbudowanymi składnikami oprogramowania pośredniczącego, jak pokazano w tym przykładzie:

Diagram przedstawiający przepływ żądania za pośrednictwem potoku.

Zespół operacyjny ds. sieci firmy rozwiązuje problemy z wydajnością w środowisku produkcyjnym. Twój zespół kierował zadaniem zaimplementowania niektórych funkcji, aby lepiej obsługiwać monitorowanie aplikacji w czasie rzeczywistym. Aplikacja powinna rejestrować szczegóły żądania do konsoli. Dla każdego żądania powinien rejestrować metodę żądania, ścieżkę i kod stanu odpowiedzi.

W tym ćwiczeniu utworzysz niestandardowy składnik oprogramowania pośredniczącego, który rejestruje szczegóły żądania do konsoli.

Dodawanie niestandardowego oprogramowania pośredniczącego

Zmodyfikujmy istniejącą aplikację ASP.NET Core, aby uwzględnić niestandardowe oprogramowanie pośredniczące, które rejestruje szczegóły żądania do konsoli.

  1. Otwórz plik Program.cs, jeśli nie został jeszcze otwarty.

  2. Bezpośrednio przed app.Run()wstaw następujący kod:

    app.Use(async (context, next) =>
    {
        Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}");
        await next(); 
    });
    

    Powyższy kod:

    • app.Use() dodaje do potoku niestandardowy składnik oprogramowania pośredniczącego. Składnik przyjmuje HttpContext obiekt i RequestDelegate obiekt jako parametry.
    • Delegat zapisuje w konsoli kod stanu żądania, ścieżki i odpowiedzi.
    • await next() wywołuje następny składnik oprogramowania pośredniczącego w potoku.

Testowanie zmian

  1. Naciśnij Ctrl+Shift+F5 , aby ponownie skompilować i ponownie uruchomić aplikację.

  2. Po otwarciu okna przeglądarki zwróć uwagę, że główny adres URL wyświetla komunikat "Witamy w firmie Contoso!"

  3. Dodaj /history do adresu URL i naciśnij Enter. Przeglądarka przekierowuje do /about strony.

  4. W programie Visual Studio Code naciśnij Ctrl+Shift+P , aby otworzyć paletę poleceń. Wyszukaj i wybierz pozycję Konsola debugowania: skoncentruj się na widoku konsoli debugowania, aby przełączyć się na kartę Konsola debugowania w dolnym panelu. Zwróć uwagę na następujące wiersze:

    GET / 200
    GET /about 200
    

    Dane wyjściowe konsoli zawierają kod stanu żądania, ścieżki i odpowiedzi dla każdego żądania. Pierwszy wiersz zawiera żądanie dla głównego adresu URL, a drugi wiersz pokazuje żądanie dla /about strony.

    Uwaga

    Przeglądarka może również zażądać ./favicon.ico Jest to standardowe żądanie favicon witryny internetowej i można je zignorować.

  5. Pozostaw aplikację uruchomioną na potrzeby następnego ćwiczenia.

Zmienianie kolejności oprogramowania pośredniczącego

Aplikacja wydaje się działać, ale występuje problem. Zażądano /history strony, ale dane wyjściowe konsoli nie są wyświetlane. To zachowanie jest spowodowane tym, że niestandardowy składnik oprogramowania pośredniczącego, który rejestruje szczegóły żądania, został dodany po zainstalowaniu oprogramowania pośredniczącego do ponownego autora adresów URL. Oprogramowanie pośredniczące autora adresów URL przekierowuje żądania z /history do /about i wysyła odpowiedź, a niestandardowy składnik oprogramowania pośredniczącego nie widzi żądania. Naprawmy to.

  1. app.Use() Przenieś wiersz dodany bezpośrednio przed wierszemapp.UseRewriter().

    Pełny plik Program.cs powinien wyglądać następująco:

    using Microsoft.AspNetCore.Rewrite;
    
    var builder = WebApplication.CreateBuilder(args);
    var app = builder.Build();
    
    app.Use(async (context, next) =>
    {
        Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}");
        await next(); 
    });
    
    app.UseRewriter(new RewriteOptions().AddRedirect("history", "about"));
    
    app.MapGet("/", () => "Hello World!");
    app.MapGet("/about", () => "Contoso was founded in 2000.");
    
    app.Run();
    

    Teraz niestandardowy składnik oprogramowania pośredniczącego jest dodawany przed oprogramowaniem pośredniczącym do ponownego autora adresów URL. Niestandardowy składnik oprogramowania pośredniczącego rejestruje szczegóły żądania, zanim oprogramowanie pośredniczące autora adresu URL przetwarza żądanie i przekierowuje je.

  2. Uruchom ponownie aplikację i przetestuj ją tak jak poprzednio. Tym razem dane wyjściowe konsoli debugowania powinny zawierać żądanie dla /history strony.

    GET / 200
    GET /history 200
    GET /about 200
    

    Dane wyjściowe konsoli pokazują teraz żądanie strony /history bezpośrednio przed przekierowaniem do /about strony.

Naprawianie kodu stanu

Aplikacja jest prawie gotowa, ale istnieje jeszcze jeden problem. Kod stanu w danych wyjściowych konsoli jest zawsze 200, nawet gdy aplikacja przekierowuje żądanie. Kod /history stanu żądania powinien być przekierowanym adresem 302. Przyczyną tego zachowania jest inny problem z kolejnością przetwarzania składników oprogramowania pośredniczącego.

Niestandardowy składnik oprogramowania pośredniczącego rejestruje szczegóły w konsoli, a następnie wywołuje metodę await next() przekazywania do następnego składnika oprogramowania pośredniczącego. Problem polega na StatusCode tym, że właściwość Response obiektu jest ustawiana po uruchomieniu odpowiedzi przez składnik oprogramowania pośredniczącego terminalu. Zmieńmy kod, aby rozwiązać ten problem.

  1. W dodanym delegacie przenieś Console.WriteLine() wiersz do po await next() wierszu.

    Zaktualizowany kod powinien wyglądać następująco:

    app.Use(async (context, next) =>
    {
        await next(); 
        Console.WriteLine($"{context.Request.Method} {context.Request.Path} {context.Response.StatusCode}");
    });
    

    Teraz niestandardowy składnik oprogramowania pośredniczącego będzie rejestrować szczegóły żądania po składniku oprogramowania pośredniczącego terminalu ustawia kod stanu odpowiedzi.

  2. Uruchom ponownie i przetestuj /history żądanie ponownie. Dane wyjściowe konsoli debugowania powinny teraz wyświetlać prawidłowy kod stanu.

    GET / 200
    GET /history 302
    GET /about 200