Bagikan melalui


Penangan Pesan HttpClient di API Web ASP.NET

Handler pesan adalah kelas yang menerima permintaan HTTP dan mengembalikan respons HTTP.

Biasanya, serangkaian penangan pesan dirangkai bersama-sama. Handler pertama menerima permintaan HTTP, melakukan beberapa pemrosesan, dan memberikan permintaan ke handler berikutnya. Pada titik tertentu, respons dibuat dan kembali ke rantai. Pola ini disebut penangan pendelegasian .

Diagram penangan pesan dirangkai bersama-sama, mengilustrasikan proses untuk menerima permintaan H T T P dan mengembalikan respons H T T P.

Di sisi klien, kelas HttpClient menggunakan penangan pesan untuk memproses permintaan. Handler default adalah HttpClientHandler, yang mengirim permintaan melalui jaringan dan mendapatkan respons dari server. Anda dapat menyisipkan penangan pesan kustom ke dalam alur klien:

Diagram proses untuk menyisipkan penangan pesan kustom ke dalam alur klien. Menampilkan kelas klien h t t p yang menggunakan penangan pesan untuk memproses permintaan.

Catatan

ASP.NET Web API juga menggunakan penangan pesan di sisi server. Untuk informasi selengkapnya, lihat Penangan Pesan HTTP.

Penangan Pesan Kustom

Untuk menulis handler pesan kustom, berasal dari System.Net.Http.DelegatingHandler dan ambil alih metode SendAsync . Berikut adalah tanda tangan metode:

Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken);

Metode ini mengambil HttpRequestMessage sebagai input dan secara asinkron mengembalikan HttpResponseMessage. Implementasi umum melakukan hal berikut:

  1. Memproses pesan permintaan.
  2. Panggil base.SendAsync untuk mengirim permintaan ke handler dalam.
  3. Handler dalam mengembalikan pesan respons. (Langkah ini asinkron.)
  4. Proses respons dan kembalikan ke pemanggil.

Contoh berikut menunjukkan penangan pesan yang menambahkan header kustom ke permintaan keluar:

class MessageHandler1 : DelegatingHandler
{
    private int _count = 0;

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        System.Threading.Interlocked.Increment(ref _count);
        request.Headers.Add("X-Custom-Header", _count.ToString());
        return base.SendAsync(request, cancellationToken);
    }
}

Panggilan ke base.SendAsync bersifat asinkron. Jika handler melakukan pekerjaan apa pun setelah panggilan ini, gunakan kata kunci tunggu untuk melanjutkan eksekusi setelah metode selesai. Contoh berikut menunjukkan handler yang mencatat kode kesalahan. Pengelogan itu sendiri tidak terlalu menarik, tetapi contoh menunjukkan cara mendapatkan respons di dalam handler.

class LoggingHandler : DelegatingHandler
{
    StreamWriter _writer;

    public LoggingHandler(Stream stream)
    {
        _writer = new StreamWriter(stream);
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        if (!response.IsSuccessStatusCode)
        {
            _writer.WriteLine("{0}\t{1}\t{2}", request.RequestUri, 
                (int)response.StatusCode, response.Headers.Date);
        }
        return response;
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            _writer.Dispose();
        }
        base.Dispose(disposing);
    }
}

Menambahkan Penangan Pesan ke Alur Klien

Untuk menambahkan handler kustom ke HttpClient, gunakan metode HttpClientFactory.Create :

HttpClient client = HttpClientFactory.Create(new Handler1(), new Handler2(), new Handler3());

Penangan pesan dipanggil dalam urutan yang Anda berikan ke metode Buat . Karena handler ditumpuk, pesan respons berjalan ke arah lain. Artinya, handler terakhir adalah yang pertama mendapatkan pesan respons.