Cara log permintaan dan respons metadata di ASP.NET Web API

Seperti otentikasi, caching, dan manajemen pengecualian, logging adalah masalah lintas sektoral - fungsi yang memengaruhi seluruh aplikasi - yang harus dipusatkan. Kami sering mencatat data aplikasi yang mungkin menyertakan urutan panggilan atau peristiwa metode, tindakan pengguna, atau bahkan kesalahan yang mungkin terjadi saat aplikasi dijalankan. Ada banyak kerangka kerja logging yang dapat Anda manfaatkan, tetapi dalam artikel ini kami akan fokus pada bagaimana kami dapat mencatat permintaan dan respons di ASP.NET Web API.

Permintaan dan respons pencatatan di Web API sangat membantu dalam debugging, pelacakan, dan pemeriksaan panggilan layanan masuk dan keluar. Dengan mencatat semua permintaan dan tanggapan di satu tempat, mendeteksi masalah di setiap permintaan dan tanggapan menjadi mudah. Dalam posting ini, kami akan membuat penangan pesan khusus untuk memantau dan mencatat permintaan dan tanggapan di API Web. Penangan pesan akan digunakan untuk mencegat panggilan dan mencatat semua permintaan dan tanggapan secara terpusat di satu tempat.

Strategi untuk memasukkan masalah lintas sektor dalam API Web

Ada beberapa cara untuk memasukkan logging dan masalah lintas sektoral lainnya di Web API. Salah satu caranya adalah membuat kelas ApiController khusus, atau kelas dasar untuk semua pengontrol kita, lalu mengganti metode ExecuteAsync. Cara lainnya adalah dengan menggunakan filter tindakan kustom. Namun, kedua strategi ini memiliki keterbatasan. Dalam kasus sebelumnya, kami harus memastikan bahwa semua pengontrol kami memperluas kelas pengontrol basis kustom. Yang terakhir, kita harus memastikan bahwa filter diterapkan pada semua pengontrol yang kita gunakan.

Strategi terbaik menurut saya adalah menggunakan penangan pesan karena Anda menulisnya hanya sekali dan kemudian mendaftarkannya di satu tempat. Selain itu, karena penangan pesan khusus akan dipanggil jauh lebih awal dalam pipeline, yaitu, bahkan sebelum HttpControllerDispatcher, ia sangat cocok untuk memasukkan masalah lintas sektoral. Secara kebetulan, penangan pesan adalah kelas yang mewarisi kelas abstrak HttpMessageHandler. Karenanya, kami akan memanfaatkan penangan pesan untuk memasukkan logger khusus kami di posting ini.

Jika Anda ingin membangun dan menjalankan kode sumber yang diilustrasikan dalam posting ini, Anda harus memiliki Visual Studio dan berjalan di sistem Anda. Selain itu, Anda harus menginstal NLog. Jika Anda ingin tahu cara menginstal, mengkonfigurasi, dan menggunakan NLog, lihat artikel saya di NLog di sini.  

Membangun logger pelanggan kami untuk API Web

Buat proyek API Web baru di Visual Studio dan simpan dengan nama yang Anda inginkan. Kami akan memanfaatkan penangan pendelegasian khusus di sini untuk mencegat panggilan ke API Web. Pertama, mari buat kelas POCO khusus yang akan menyimpan semua informasi dari permintaan dan tanggapan kita.

kelas publik LogMetadata

    {

        public string RequestContentType {get; set; }

        public string RequestUri {get; set; }

        public string RequestMethod {get; set; }

        publik DateTime? RequestTimestamp {get; set; }

        public string ResponseContentType {get; set; }

        publik HttpStatusCode ResponseStatusCode {get; set; }

        publik DateTime? ResponseTimestamp {get; set; }

    }

Sekarang kita akan menerapkan kelas khusus yang disebut LogHandler. Ini pada dasarnya adalah penangan pesan yang memperluas kelas DelegatingHandler.

kelas publik CustomLogHandler: DelegatingHandler

    {

        protected override async Task SendAsync (permintaan HttpRequestMessage, CancellationToken cancellationToken)

        {

           return base.SendAsync (request, cancellationToken);

        }

    }

Cuplikan kode berikut menunjukkan bagaimana Anda dapat membuat metadata permintaan. Metode ini akan dipanggil dari metode SendAsync penangan pesan khusus kami dan akan mengembalikan instance kelas LogMetadata.

pribadi LogMetadata BuildRequestMetadata (permintaan HttpRequestMessage)

    {

        Log LogMetadata = LogMetadata baru

        {

            RequestMethod = request.Method.Method,

            RequestTimestamp = DateTime.Now,

            RequestUri = request.RequestUri.ToString ()

        };

        log kembali;

    }

Hal berikutnya yang perlu kita lakukan adalah memperbarui instance metadata log dengan informasi dari objek respons. Berikut cara melakukannya.

pribadi LogMetadata BuildResponseMetadata (LogMetadata logMetadata, tanggapan HttpResponseMessage)

    {

        logMetadata.ResponseStatusCode = response.StatusCode;

        logMetadata.ResponseTimestamp = DateTime.Now;

        logMetadata.ResponseContentType = response.Content.Headers.ContentType.MediaType;

        kembali logMetadata;

    }

Berikut ini kode sumber lengkap pengendali pesan khusus untuk referensi Anda.

kelas publik CustomLogHandler: DelegatingHandler

    {

        protected override async Task SendAsync (permintaan HttpRequestMessage, CancellationToken cancellationToken)

        {

            var logMetadata = BuildRequestMetadata (permintaan);

            var response = menunggu base.SendAsync (request, cancellationToken);

            logMetadata = BuildResponseMetadata (logMetadata, respons);

            menunggu SendToLog (logMetadata);

            respon balasan;

        }

        pribadi LogMetadata BuildRequestMetadata (permintaan HttpRequestMessage)

        {

            Log LogMetadata = LogMetadata baru

            {

                RequestMethod = request.Method.Method,

                RequestTimestamp = DateTime.Now,

                RequestUri = request.RequestUri.ToString ()

            };

            log kembali;

        }

        pribadi LogMetadata BuildResponseMetadata (LogMetadata logMetadata, tanggapan HttpResponseMessage)

        {

            logMetadata.ResponseStatusCode = response.StatusCode;

            logMetadata.ResponseTimestamp = DateTime.Now;

            logMetadata.ResponseContentType = response.Content.Headers.ContentType.MediaType;

            kembali logMetadata;

        }

        private async Task SendToLog (LogMetadata logMetadata)

        {

            // TODO: Tulis kode di sini untuk menyimpan instance logMetadata ke penyimpanan log yang telah dikonfigurasi sebelumnya ...

            kembali benar;

        }

    }

Perhatikan bahwa Anda perlu menulis kode yang diperlukan untuk menyimpan instance logMetadata yang ditampilkan dalam metode SendToLog ke target log yang telah dikonfigurasi sebelumnya, yaitu file atau database. Saya lebih suka menggunakan NLog untuk mencatat metadata ini. Sekali lagi, Anda dapat merujuk ke artikel saya di NLog untuk melihat bagaimana ini bisa dilakukan.

Mendaftarkan penangan pesan

Untuk mendaftarkan penangan pesan khusus, Anda dapat memanfaatkan acara Application_Start di file Global.asax.cs atau metode Daftar kelas WebApiConfig. Potongan kode berikut mengilustrasikan bagaimana Anda dapat mendaftarkan handler menggunakan metode Register dari kelas WebApiConfig.

public static void Register (konfigurasi HttpConfiguration)

    {

      // Tulis kode biasa Anda di sini ...

      config.MessageHandlers.Add (new CustomLogHandler ());

    }

Dalam artikel ini kami memeriksa bagaimana kami dapat mencatat permintaan dan tanggapan di API Web menggunakan penangan pesan khusus. Penangan pesan adalah cara terbaik untuk memasukkan masalah lintas sektor ke dalam pipeline API Web. Meskipun kami memiliki cara lain untuk memasukkan login ke Web API, seperti kelas ApiController kustom atau filter tindakan kustom, menggunakan penangan pesan kustom adalah pendekatan yang lebih sederhana. Anda dapat mengubah penerapan ini berdasarkan kebutuhan Anda, misalnya, untuk menambahkan lebih banyak metadata khusus.

Cara melakukan lebih banyak di ASP.NET dan ASP.NET Core:

  • Cara menggunakan cache dalam memori di ASP.NET Core
  • Bagaimana menangani kesalahan di ASP.NET Web API
  • Cara meneruskan beberapa parameter ke metode pengontrol API Web
  • Cara log permintaan dan respons metadata di ASP.NET Web API
  • Cara bekerja dengan HttpModules di ASP.NET
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara menggunakan injeksi ketergantungan di ASP.NET Core
  • Cara bekerja dengan sesi di ASP.NET
  • Bagaimana bekerja dengan HTTPHandlers di ASP.NET
  • Cara menggunakan IHostedService di ASP.NET Core
  • Cara menggunakan layanan sabun WCF di ASP.NET Core
  • Cara meningkatkan kinerja aplikasi ASP.NET Core
  • Cara menggunakan ASP.NET Core Web API menggunakan RestSharp
  • Cara bekerja dengan masuk ke ASP.NET Core
  • Cara menggunakan MediatR di ASP.NET Core
  • Cara bekerja dengan status sesi di ASP.NET Core
  • Cara menggunakan Nancy di ASP.NET Core
  • Pahami pengikatan parameter di ASP.NET Web API
  • Cara mengupload file di ASP.NET Core MVC
  • Bagaimana menerapkan penanganan pengecualian global di ASP.NET Core Web API
  • Cara menerapkan pemeriksaan kesehatan di ASP.NET Core
  • Praktik terbaik dalam caching di ASP.NET
  • Cara menggunakan perpesanan Apache Kafka di .NET
  • Cara mengaktifkan CORS di API Web Anda
  • Kapan menggunakan WebClient vs. HttpClient vs. HttpWebRequest
  • Cara bekerja dengan Redis Cache di .NET
  • Kapan menggunakan Task.WaitAll vs. Task.WhenAll di .NET