WebServislerin İstek ve Cevaplarını Tek Bir Noktadan Loglamak

Bir süredir üzerinde çalıştığım tek noktadan servis loglama ile ilgili bir kaç hususu paylaşmak istiyorum. Soap veya rest servislerde her bir metot için ayrı ayrı loglama yapmanıza gerek yok. Gerek mvc webapi de olsun gerek wcf servislerde olsun tek bir noktadan yapacağınız düzenleme ile loglamaları kolaylıkla yapabilirsiniz. Bunun için net.http veya web.http altındaki ilgili metotları kullanmanız yeterli.

Örneğimizi webapi üzerinden verecek olursak uygulamanız IIS üzerinde başlatılırken Application_start metot çalışır. Bu metot içerisine yazacağınız register overload metotlar her seferinde çalışacak ve servisinize gelen tüm istekler loglanacaktır. Dilerseniz keyvalue pair şeklinde değerleri ayrıştırarak ya da header body içindeki değerleri sırasıyla gezerek parametrik loglama da yapabilirsiniz.

Benzer şekilde delegating handler kullanan classları başlangıçta register ederek te loglamayı yapabiliriz.

WebApi de en çok kullanılan delegating hadler olduğu için onunla bir örnek yapalım.

protected void Application_Start()
{

GlobalConfiguration.Configuration.MessageHandlers.Add(new IstekveCevabiLogla());

}

public class IstekveCevabiLogla: DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
//istek loglama
string requestBody = await request.Content.ReadAsStringAsync();

//requestBody ile ister text ister database loglamayı burada yapabilirsiniz.

// servisteki süreçlerinizi bitirdikten sonra sonucunuz varsa onu da loglayabilirsiniz.
var result = await base.SendAsync(request, cancellationToken);

if (result.Content != null)
{
// cevabı loglama
var responseBody = await result.Content.ReadAsStringAsync();
//responseBody i ister text ister sql de saklayabilirsiniz.
}

return result;
}
}