Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 .
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:
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:
- Memproses pesan permintaan.
- Panggil
base.SendAsync
untuk mengirim permintaan ke handler dalam. - Handler dalam mengembalikan pesan respons. (Langkah ini asinkron.)
- 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.