2016-06-25 33 views
7

Web API hata yönetimi ile en iyi uygulamanın hangisi olduğunu açıklar mısınız? Aslında, Api isteğimi yakalamayı denemek için iyi bir uygulama olup olmadığını bilmiyorum. Bir istisna yeniden atmak tr sadece benim yakalamak log çünküASP.NET Web API'sı ile hata işleme için en iyi yöntem

public Vb.Order PostOrderItem(Vb.Order order) 
{ 
    if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true) 
    { 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
     throw new HttpResponseException(httpResponseMessage); 
    } 
    if (!ModelState.IsValid) 
    { 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); 
     throw new HttpResponseException(httpResponseMessage); 
    } 

    try 
    { 
     return Vb.Document.Generate(order); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); 
     httpResponseMessage.Content = new StringContent(ex.Message); 
     throw new HttpResponseException(httpResponseMessage); 
    } 

} 

Ben bir sunucu tarafı kod deneyin yakalamak kullanarak duygu var iyi bir uygulama değildir.

cevap

15

Hata işleme bir çapraz kesme endişe olarak kabul edilir ve geliştiriciler kesişen kaygıları odaklanmak gerekmez böylece boru hattı başka bir yere yerleştirilmelidir.

Bir Web API kontrolör yakalanmamış istisna atar ne olur Exception Handling in ASP.NET Web API

bir okuma almalı? varsayılan olarak, çoğu özel durum durum kodu 500, Dahili Sunucu Hatası ile bir HTTP yanıtına dönüştürülür.

ve ayrıca Global Error Handling in ASP.NET Web API 2

Sen yalın mümkün olduğunca Denetleyicinizi tutmaya çalışmalısınız. Orijinal kodunuz gibi işlenirken hata, yalnızca kodun çoğaltılmasına ve geliştiricilerin farkında olması için gereksiz kaygılara neden olur. Geliştiriciler, çapraz-endişe kaygılarına değil, temel meseleye odaklanmalıdır. Sadece temel konuya odaklanarak yukarıdaki kod şu şekilde görünecektir:

[MyAuthentication] 
[MyValidateModel] 
public Vb.Order PostOrderItem(Vb.Order order) 
{  
    return Vb.Document.Generate(order); 
} 

Neden bu kadar yalın?

Çünkü:

if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true) 
{ 
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
    throw new HttpResponseException(httpResponseMessage); 
} 

ilgili bir yanıt dönmek için küresel kontrolör/eylem yerel olarak uygulanan ya edilebilir Authentication Filters in ASP.NET Web API 2 içine taşınabilir. Bu

if (!ModelState.IsValid) 
{ 
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest); 
    throw new HttpResponseException(httpResponseMessage); 
} 

gibi

Model Validation in ASP.NET Web API da benzeri bir filtre taşındı edilebilir.

public class MyValidateModelAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (!actionContext.ModelState.IsValid) 
     { 
      actionContext.Response = actionContext.Request.CreateErrorResponse(
       HttpStatusCode.BadRequest, actionContext.ModelState); 
     } 
    } 
} 
+0

Bu cevap için teşekkür ederiz. Sadece bir bonus soru: Elmah ne olacak? Araçlar çok uzun süredir güncellenmedi. Buna artık ihtiyacımız olmadığına göre, doğru mu? –

+0

Hala kullanabilirsiniz. Ve kullanışlı bir araç kadar. Cevabın verdiği bağlantılarda belirtilen stratejileri tamamlar, çünkü çevrede bulunan elmah için hataları iletebilir/günlüğe kaydedebilir. Elmah'ın takılabilir doğası, aynı zamanda çapraz-kesen kaygılarla uğraşmaya nasıl odaklandığını göstermektedir. – Nkosi

+0

Sorudaki 'logger.Error (ex);' koduna ne dersiniz? Vb.Document.Generate (order) 'ın bir veritabanı çağrısı olduğunu varsayalım ve eğer olursak olağan dışı durumu günlüğe kaydetmek istiyorum. Ve hata mesajını json cevabına geri gönderin. Hata işleyicilerinde yapmış olacak – ca9163d9

7

Lütfen bu bağlantıya bakın Exception Handling in ASP.NET Web API - A Guided Tour.- HttpResponseException

  • Seviye 2 - İstisna Filtreler
  • Seviye 3 - Açma
  • Seviye 4 - İstisna Eylemciler
  • Web

    • Seviye 1: 4 seviyeli istisna işleme boru hattı vardır API, istisna işleme açısından bize büyük bir esneklik sağlar. Özeti:

      • HttpResponseException veya eylem düzeyinde işlenmeyen özel durumlarla ilgilenmek için kısayol yöntemlerini kullanın.
      • Birden çok eylem ve denetleyicide özellikle işlenmeyen özel durumlarla ilgilenmek için Özel Durum Filtrelerini kullanın.
      • İşlenmeyen istisnaları günlüğe kaydetmek için ExceptionLogger'ı kullanın.
      • Uygulama genelinde işlenmeyen istisnalarla ilgilenmek için İstisna İşleyicileri (uygulama başına bir adet) kullanın.
    +0

    Harika cevap, teşekkürler! –