ASP.NET Web API 2'de izleme
Web tabanlı bir uygulamada hata ayıklamaya çalışırken, iyi bir izleme günlükleri kümesinin yerini tutmaz. Bu öğreticide, ASP.NET Web API'sinde izlemeyi etkinleştirme gösterilmektedir. Web API çerçevesinin denetleyicinizi çağırmadan önce ve sonra ne yaptığını izlemek için bu özelliği kullanabilirsiniz. Kendi kodunuzu izlemek için de kullanabilirsiniz.
Öğreticide kullanılan yazılım sürümleri
- Visual Studio 2017 (Visual Studio 2015 ile de çalışır)
- Web API 2
- Microsoft.AspNet.WebApi.Tracing
Web API'sinde System.Diagnostics İzlemeyi Etkinleştirme
İlk olarak yeni bir ASP.NET Web Uygulaması projesi oluşturacağız. Visual Studio'da, Dosyamenüsünden Yeni Proje'yi> seçin. Şablonlar, Web'in altında ASP.NET Web Uygulaması'nı seçin.
Web API proje şablonunu seçin.
Araçlar menüsünde NuGet Paket Yöneticisi'ni ve ardından Paket Yönetimi Konsolu'nu seçin.
Paket Yöneticisi Konsolu penceresinde aşağıdaki komutları yazın.
Install-Package Microsoft.AspNet.WebApi.Tracing
Update-Package Microsoft.AspNet.WebApi.WebHost
İlk komut en son Web API'sinin izleme paketini yükler. Ayrıca temel Web API paketlerini de güncelleştirir. İkinci komut, WebApi.WebHost paketini en son sürüme güncelleştirir.
Not
Web API'sinin belirli bir sürümünü hedeflemek istiyorsanız, izleme paketini yüklerken -Version bayrağını kullanın.
App_Start klasöründe WebApiConfig.cs dosyasını açın. Aşağıdaki kodu Register yöntemine ekleyin.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// New code
config.EnableSystemDiagnosticsTracing();
// Other configuration code not shown.
}
}
Bu kod , SystemDiagnosticsTraceWriter sınıfını Web API işlem hattına ekler. SystemDiagnosticsTraceWriter sınıfı, izlemeleri System.Diagnostics.Trace'e yazar.
İzlemeleri görmek için uygulamayı hata ayıklayıcısında çalıştırın. Tarayıcıda /api/values
adresine gidin.
İzleme deyimleri Visual Studio'daki Çıkış penceresine yazılır. ( Görünümmenüsünden Çıkış'ı seçin).
SystemDiagnosticsTraceWriter, System.Diagnostics.Trace'e izleme yazdığından, ek izleme dinleyicilerini kaydedebilirsiniz; örneğin, bir günlük dosyasına izleme yazmak için. İzleme yazarları hakkında daha fazla bilgi için MSDN'de İzleme Dinleyicileri konusuna bakın.
SystemDiagnosticsTraceWriter'i Yapılandırma
Aşağıdaki kod, izleme yazıcısını yapılandırmayı gösterir.
SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing();
traceWriter.IsVerbose = true;
traceWriter.MinimumLevel = TraceLevel.Debug;
Denetleyebileceğiniz iki ayar vardır:
- IsVerbose: False ise, her izleme en az bilgi içerir. Doğruysa izlemeler daha fazla bilgi içerir.
- Minimum Düzey: En düşük izleme düzeyini ayarlar. İzleme düzeyleri sırayla Hata Ayıklama, Bilgi, Uyarı, Hata ve Önemli düzeylerdir.
Web API Uygulamanıza İzleme Ekleme
İzleme yazıcısı eklemek, Web API işlem hattı tarafından oluşturulan izlemelere anında erişmenizi sağlar. Kendi kodunuzu izlemek için izleme yazıcısını da kullanabilirsiniz:
using System.Web.Http.Tracing;
public class ProductsController : ApiController
{
public HttpResponseMessage GetAllProducts()
{
Configuration.Services.GetTraceWriter().Info(
Request, "ProductsController", "Get the list of products.");
// ...
}
}
İzleme yazıcısını almak için HttpConfiguration.Services.GetTraceWriter'ı çağırın. Bir denetleyiciden bu yönteme ApiController.Configuration özelliği aracılığıyla erişilebilir.
İzleme yazmak için ITraceWriter.Trace yöntemini doğrudan çağırabilirsiniz, ancak ITraceWriterExtensions sınıfı daha kolay olan bazı uzantı yöntemlerini tanımlar. Örneğin, yukarıda gösterilen Bilgi yöntemi izleme düzeyi Bilgi ile bir izleme oluşturur.
Web API İzleme Altyapısı
Bu bölümde, Web API için özel izleme yazıcısı yazma işlemi açıklanmaktadır.
Microsoft.AspNet.WebApi.Tracing paketi, Web API'sindeki daha genel bir izleme altyapısının üzerine kurulmuştur. Microsoft.AspNet.WebApi.Tracing kullanmak yerine NLog veya log4net gibi başka bir izleme/günlük kitaplığını da takabilirsiniz.
İzlemeleri toplamak için ITraceWriter arabirimini uygulayın. Aşağıda basit bir örnek verilmiştir:
public class SimpleTracer : ITraceWriter
{
public void Trace(HttpRequestMessage request, string category, TraceLevel level,
Action<TraceRecord> traceAction)
{
TraceRecord rec = new TraceRecord(request, category, level);
traceAction(rec);
WriteTrace(rec);
}
protected void WriteTrace(TraceRecord rec)
{
var message = string.Format("{0};{1};{2}",
rec.Operator, rec.Operation, rec.Message);
System.Diagnostics.Trace.WriteLine(message, rec.Category);
}
}
ITraceWriter.Trace yöntemi bir izleme oluşturur. Çağıran bir kategori ve izleme düzeyi belirtir. Kategori, kullanıcı tanımlı herhangi bir dize olabilir. İzleme uygulamanız aşağıdakileri yapmalıdır:
- Yeni bir TraceRecord oluşturun. Gösterildiği gibi istek, kategori ve izleme düzeyiyle başlatın. Bu değerler çağıran tarafından sağlanır.
- traceAction temsilcisini çağırın. Bu temsilcinin içinde, çağıranın TraceRecord'un geri kalanını doldurması beklenir.
- İstediğiniz günlük tekniğini kullanarak TraceRecord'ı yazın. Burada gösterilen örnek basitçe System.Diagnostics.Trace'i çağırır.
İzleme Yazıcısını Ayarlama
İzlemeyi etkinleştirmek için Web API'sini ITraceWriter uygulamanızı kullanacak şekilde yapılandırmanız gerekir. Bunu, aşağıdaki kodda gösterildiği gibi HttpConfiguration nesnesi aracılığıyla yaparsınız:
public static void Register(HttpConfiguration config)
{
config.Services.Replace(typeof(ITraceWriter), new SimpleTracer());
}
Yalnızca bir izleme yazıcısı etkin olabilir. Varsayılan olarak, Web API'sinde hiçbir işlem yapılmayan bir "işlem yapılmaz" izleyicisi ayarlanır. (İzleme kodunun izleme yazmadan önce izleme yazıcısının null olup olmadığını denetlemesi gerekmemesi için "işlem yok" izleyicisi vardır.)
Web API İzleme Nasıl Çalışır?
Web API'sinde izleme bir cephe deseni kullanır: İzleme etkinleştirildiğinde, Web API'sinin istek işlem hattının çeşitli bölümlerini izleme çağrıları gerçekleştiren sınıflarla sarmalar.
Örneğin, bir denetleyici seçerken işlem hattı IHttpControllerSelector arabirimini kullanır. İzleme etkinleştirildiğinde işlem hattı, IHttpControllerSelector uygulayan ancak gerçek uygulamaya ileten bir sınıf ekler:
Bu tasarımın avantajları şunlardır:
- İzleme yazıcısı eklemezseniz, izleme bileşenleri örneklenmez ve performans etkisi olmaz.
- IHttpControllerSelector gibi varsayılan hizmetleri kendi özel uygulamanızla değiştirirseniz, izleme sarmalayıcı nesnesi tarafından yapıldığından izleme etkilenmez.
Ayrıca, varsayılan ITraceManager hizmetini değiştirerek Web API izleme çerçevesinin tamamını kendi özel çerçevenizle değiştirebilirsiniz:
config.Services.Replace(typeof(ITraceManager), new MyTraceManager());
İzleme sisteminizi başlatmak için ITraceManager.Initialize uygulayın. Bunun, Web API'sinde yerleşik olarak bulunan tüm izleme kodu da dahil olmak üzere tüm izleme çerçevesinin yerini aldığına dikkat edin.