ASP.NET Web API'sinde HttpClient İleti İşleyicileri

İleti işleyicisi, HTTP isteği alan ve HTTP yanıtı döndüren bir sınıftır.

Genellikle bir dizi ileti işleyicisi birbirine zincirlenir. İlk işleyici bir HTTP isteği alır, biraz işlem yapar ve isteği bir sonraki işleyiciye verir. Yanıt bir noktada oluşturulur ve zincirin yukarısına geri döner. Bu desene delegasyon işleyicisi adı verilir.

Bir H T T P isteği alma ve H T T P yanıtı döndürme işlemini gösteren, zincirlenmiş ileti işleyicilerinin diyagramı.

İstemci tarafında , HttpClient sınıfı istekleri işlemek için bir ileti işleyicisi kullanır. Varsayılan işleyici, isteği ağ üzerinden gönderen ve yanıtı sunucudan alan HttpClientHandler'dır. İstemci işlem hattına özel ileti işleyicileri ekleyebilirsiniz:

İstemci işlem hattına özel ileti işleyicileri ekleme işleminin diyagramı. İstekleri işlemek için bir ileti işleyicisi kullanan h t t p İstemci sınıfını gösterir.

Uyarı

ASP.NET Web API'sinde sunucu tarafında ileti işleyicileri de kullanılır. Daha fazla bilgi için bkz. HTTP İleti İşleyicileri.

Özel İleti İşleyicileri

Özel ileti işleyicisi yazmak için System.Net.Http.DelegatingHandler'dan türetin ve SendAsync yöntemini geçersiz kılın. Yöntem imzası aşağıdadır:

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

yöntemi giriş olarak bir HttpRequestMessage alır ve zaman uyumsuz olarak bir HttpResponseMessage döndürür. Tipik bir uygulama aşağıdakileri yapar:

  1. İstek iletisini işleme.
  2. İsteği iç işleyiciye göndermek için base.SendAsync çağrısı yap.
  3. İç işleyici bir yanıt iletisi döndürür. (Bu adım zaman uyumsuzdur.)
  4. Yanıtı işleyin ve çağırana geri gönderin.

Aşağıdaki örnekte, giden isteğe özel üst bilgi ekleyen bir ileti işleyicisi gösterilmektedir:

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

base.SendAsync çağrısı zaman uyumsuzdur. İşleyici bu çağrıdan sonra herhangi bir iş yaparsa, yöntem tamamlandıktan sonra yürütmeyi sürdürmek için await anahtar sözcüğünü kullanın. Aşağıdaki örnekte hata kodlarını günlüğe kaydeden bir işleyici gösterilmektedir. Günlüğün kendisi çok ilginç değildir, ancak örnek, işlemci içindeki yanıta nasıl erişilebileceğini göstermektedir.

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

İstemci İşlem Hattına İleti İşleyicileri Ekleme

HttpClient'a özel işleyiciler eklemek için HttpClientFactory.Create yöntemini kullanın:

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

İleti işleyicileri, bunları Create yöntemine geçirme sırasına göre çağrılır. İşleyiciler iç içe yerleştirilmiş olduğundan, yanıt iletisi diğer yönde ilerler. Yani, son işleyici yanıt iletisini alan ilk işleyicidir.