SORU
24 Mayıs 2012, PERŞEMBE


En iyi dönüş için pratik ASP.NET Web hataları API

İstemci hataları biz döndüren yolunda endişelerim var.

Hemen bir hata alınca: HttpResponseException atarak hata döneceğiz

public void Post(Customer customer)
{
    if (string.IsNullOrEmpty(customer.Name))
    {
        throw new HttpResponseException("Customer Name cannot be empty", HttpStatusCode.BadRequest) 
    }
    if (customer.Accounts.Count == 0)
    {
         throw new HttpResponseException("Customer does not have any account", HttpStatusCode.BadRequest) 
    }
}

Ya da tüm hataları sonra istemciye geri gönder biz toplamak:

public void Post(Customer customer)
{
    List<string> errors = new List<string>();
    if (string.IsNullOrEmpty(customer.Name))
    {
        errors.Add("Customer Name cannot be empty"); 
    }
    if (customer.Accounts.Count == 0)
    {
         errors.Add("Customer does not have any account"); 
    }
    var responseMessage = new HttpResponseMessage<List<string>>(errors, HttpStatusCode.BadRequest);
    throw new HttpResponseException(responseMessage);
}

Bu sadece örnek bir kod, ya da doğrulama hatası veya sunucu hatası önemli değil, ben sadece en iyi uygulama, her yaklaşımın artılarını ve eksilerini bilmek istiyorum.

CEVAP
24 Mayıs 2012, PERŞEMBE


Beni genelde geri gönder HttpResponseException ve set durumu kodu buna bağlı olarak özel durum ve İstisna ölümcül ya da değil olup olmadığını belirlemek gönderiyorum geri HttpResponseException hemen.

Günün sonunda bir API yanıtları geri göndermek ve görüşlerini değil, onun iyi geri tüketiciye özel durum ve durum kodunu içeren bir mesaj göndermeyi düşünüyorum. Ben şu anda hatalar birikir ve en özel durumlar genellikle yanlış parametrelere bağlı olarak onları geri göndermek için gerekli değil ya da vb çağırır.

Bir örnekte benim app bazen istemci sormak için veri, ama orada değil herhangi bir veri mevcut yani atıyorum bir özel noDataAvailableException ve izin kabarcık web apı uygulaması, nerede o zaman benim özel filtre olan yakalar onu geri göndermekten ilgili bir mesaj ile birlikte doğru durum kodu.

100% ne bunun için en iyi uygulama konusunda emin değilim, ama bu işin bu benim işim şu anda benim için çalışıyor.

Güncelleme:

Bu soruya cevap verdiğim birkaç günlüğü gönderileri konu üzerine yazılmış:

http://weblogs.asp.net/fredriknormen/archive/2012/06/11/asp-net-web-api-exception-handling.aspx

(bu gece kurar bazı yeni özellikler vardır) http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

Güncelleme 2

Hata işleme sürecimiz güncelleme, iki vaka var:

  1. Genel hata bulundu gibi değil, ya da geçersiz parametreler hemen durdurmak için bir HttpResponseException biz iade harekete geçti. Eylemlerimizde model hataları için ayrıca Request.CreateErrorResponse uzantısı için model devlet sözlük el ve HttpResponseException sarın edeceğiz. Model ekleme durumu sözlüğünde model hataları yanıt gövdesinde gönderilen bir liste olur.

  2. Hataları ortaya yüksek katmanları, sunucu hataları, biz izin dışında kabarcık Web API uygulaması, burada küresel bir özel durum filtresi olan özel durumun, günlükleri ile elmah ve YTL için bir anlam ayarı doğru http durum kodu ve ilgili basit hata mesajı olarak vücut tekrar bir HttpResponseException. Beklediğimize olmayan özel durumlar için istemci varsayılan 500 iç sunucu hatası, ama genel bir mesaj güvenlik nedeni ile alacaksınız.

Güncelleme 3

Son zamanlarda, Web alıyorum sonra Genel hataları geri göndermek için 2, API artık IHttpActionResult arayüzü, özellikle Sistemi için sınıflar oluşturulmuş.Web.Http.Sonuçlar NotFound gibi ad, BadRequest uygun zaman, eğer biz onları uzatmak yapmadıkları takdirde, örneğin bir notfound bir yanıt iletisi ile sonucu:

public class NotFoundWithMessageResult : IHttpActionResult
{
    private string message;

    public NotFoundWithMessageResult(string message)
    {
        this.message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(HttpStatusCode.NotFound);
        response.Content = new StringContent(message);
        return Task.FromResult(response);
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobinire

    bobinire

    24 EYLÜL 2006
  • DragsterMC Gaming

    DragsterMC G

    30 HAZİRAN 2013
  • Nightmare2005

    Nightmare200

    14 Ocak 2007