Latihan - Membuat middleware kustom

Selesai

Pengembang dapat membuat komponen middleware kustom untuk menambahkan fungsionalitas ke aplikasi ASP.NET Core. Middleware kustom dapat dimasukkan di mana saja di alur middleware dan dapat digunakan dengan komponen middleware bawaan, seperti yang terlihat dalam contoh ini:

Diagram yang menunjukkan alur permintaan melalui jalur pemrosesan.

Tim operasi jaringan perusahaan Anda sedang memecahkan masalah performa di lingkungan produksi. Pemimpin tim Anda menugaskan Anda untuk mengimplementasikan beberapa fitur untuk mendukung pemantauan aplikasi secara real-time dengan lebih baik. Aplikasi harus mencatat detail permintaan ke konsol. Untuk setiap permintaan, ini harus mencatat metode permintaan, jalur, dan kode status respons.

Dalam latihan ini, Anda membuat komponen middleware kustom yang mencatat detail permintaan ke konsol.

Menambahkan middleware kustom

Mari kita ubah aplikasi ASP.NET Core yang ada untuk menyertakan middleware kustom yang mencatat detail permintaan ke konsol.

  1. Buka file Program.cs jika belum dibuka.

  2. Segera sebelum app.Run(), sisipkan kode berikut:

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

    Dalam kode sebelumnya:

    • app.Use() menambahkan komponen middleware kustom ke alur. Komponen mengambil HttpContext objek dan RequestDelegate objek sebagai parameter.
    • Delegasi menulis metode permintaan, jalur, dan kode status respons ke konsol.
    • await next() memanggil komponen middleware berikutnya dalam alur.

Menguji perubahan

  1. Tekan Ctrl+Shift+F5 untuk membangun kembali dan memulai ulang aplikasi.

  2. Saat jendela browser terbuka, perhatikan URL akar menampilkan "Selamat Datang di Contoso!"

  3. Tambahkan /history ke URL dan tekan Enter. Browser akan mengalihkan ke /about halaman.

  4. Di Visual Studio Code, tekan Ctrl+Shift+P untuk membuka palet perintah. Cari dan pilih Konsol Debug: Fokus pada Tampilan Konsol Debug untuk beralih ke tab Konsol Debug di panel bawah. Perhatikan baris berikut:

    GET / 200
    GET /about 200
    

    Output konsol menunjukkan metode permintaan, jalur, dan kode status respons untuk setiap permintaan. Baris pertama menunjukkan permintaan UNTUK URL akar, dan baris kedua menunjukkan permintaan untuk halaman tersebut /about .

    Catatan

    Browser Anda mungkin juga meminta /favicon.ico. Ini adalah permintaan standar untuk favicon situs web dan dapat diabaikan.

  5. Biarkan aplikasi berjalan untuk latihan berikutnya.

Mengubah urutan middleware

Aplikasi ini tampaknya berfungsi, tetapi ada masalah. Anda meminta /history halaman, tetapi output konsol tidak menampilkannya. Perilaku ini karena komponen middleware kustom yang mencatat detail permintaan ditambahkan setelah middleware penulis ulang URL. Middleware penulis ulang URL mengalihkan permintaan dari /history ke /about dan mengirim respons, dan komponen middleware kustom tidak melihat permintaan. Mari kita perbaiki ini.

  1. Pindahkan baris yang app.Use() Anda tambahkan ke segera sebelum app.UseRewriter() baris.

    File Program.cs lengkap akan terlihat seperti ini:

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

    Sekarang komponen middleware kustom ditambahkan sebelum middleware penulis ulang URL. Komponen middleware kustom mencatat detail permintaan sebelum middleware penulis ulang URL memproses permintaan dan mengalihkannya.

  2. Mulai ulang aplikasi lagi dan uji seperti sebelumnya. Kali ini, output Konsol Debug harus menyertakan permintaan untuk halaman./history

    GET / 200
    GET /history 200
    GET /about 200
    

    Output konsol sekarang menunjukkan permintaan halaman /history tepat sebelum dialihkan ke /about halaman.

Memperbaiki kode status

Aplikasi ini hampir siap, tetapi ada satu masalah lagi. Kode status dalam output konsol selalu 200, bahkan ketika aplikasi mengalihkan permintaan. Kode status untuk /history permintaan harus berupa pengalihan 302. Alasan untuk perilaku ini adalah masalah urutan lain di mana komponen middleware diproses.

Komponen middleware kustom mencatat detail ke konsol await next() , lalu memanggil untuk meneruskan ke komponen middleware berikutnya. Masalahnya adalah, StatusCode properti Response objek diatur setelah komponen middleware terminal memulai respons. Mari kita ubah kode untuk memperbaikinya.

  1. Di delegasi yang Anda tambahkan, pindahkan baris ke Console.WriteLine() setelah await next() baris.

    Kode yang diperbarui akan terlihat seperti ini:

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

    Sekarang komponen middleware kustom akan mencatat detail permintaan setelah komponen middleware terminal menetapkan kode status respons.

  2. Mulai ulang dan uji /history permintaan lagi. Output Konsol Debug sekarang harus menampilkan kode status yang benar.

    GET / 200
    GET /history 302
    GET /about 200