ASP.NET Web API'sindeki 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. Bir noktada yanıt oluşturulur ve zincire geri gider. Bu desen, temsilci belirleme işleyicisi olarak adlandırılır.

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.

Not

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ı şöyledir:

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şleyin.
  2. İsteği iç işleyiciye göndermek için çağrısı base.SendAsync .
  3. İç işleyici bir yanıt iletisi döndürür. (Bu adım zaman uyumsuzdur.)
  4. Yanıtı işleyin ve çağırana döndürin.

Aşağıdaki örnekte, giden isteğe özel üst bilgi ekleyen bir ileti işleyici 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);
    }
}

çağrısı base.SendAsync 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 örnekte işleyicinin içindeki yanıta nasıl ulaşılır gösterilmektedir.

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 , oluşturma yöntemine geçirdiğiniz sırayla çağrılır. İşleyiciler iç içe yerleştirildiğinden, yanıt iletisi diğer yönde ilerler. Yani, son işleyici yanıt iletisini ilk alan işleyicidir.