ASP.NET MVC 3'teki özel Hata İşleme için kesin kurallar nelerdir?


44

ASP.NET MVC'de özel hata işleme (bu durumda 3) yapma işlemi inanılmaz derecede ihmal edilmiş gibi görünüyor. Buradaki çeşitli soruları ve cevapları okudum, web'de, çeşitli araçlar için (Elmah gibi) yardım sayfalarını okudum, ancak tam bir çevreye girdiğimi ve hala en iyi çözüme sahip olmadığımı hissediyorum. Sizin yardımınızla, belki de hata işleme için yeni bir standart yaklaşım belirleyebiliriz. İşleri basit tutmak ve bunun üzerine aşırı mühendislik yapmak istemiyorum.

İşte hedeflerim:

Sunucu hataları / istisnalar için:

  1. Dev hata ayıklama bilgilerini göster
  2. Üretimde kullanıcı dostu hata sayfasını görüntüle
  3. Hataları günlüğe kaydedin ve üretimdeki yöneticiye e-postayla gönderin.
  4. 500 HTTP Durum Kodunu döndür

404 Bulunamadı hataları için:

  1. Dostça hata sayfasını görüntüle
  2. Hataları günlüğe kaydedin ve üretimdeki yöneticiye e-postayla gönderin.
  3. 404 HTTP Durum Kodunu döndür

ASP.NET MVC ile bu hedeflere ulaşmanın bir yolu var mı?


2
Daha fazla cevap alabilmesi için bu sorunun SOYUNA GERÇEK'e taşınmasını istiyorum. Kodlu cevaplar arıyorum.
Shawn Mclean

@Shawn Bu mümkün değil. Buradaki soru, burada SO ile olduğundan daha fazla ve kabul edilmiş bir cevabı var. Sorular ayrıca genellikle teknik nedenlerden dolayı yeniden taşınmaz. Belirli bir hata işleme yaklaşımını kodlama konusunda yardıma ihtiyacınız olursa, lütfen StackOverflow'ta yeni bir soru açın. Aksi taktirde, "kodlanmış cevaplar" yararlı veya cevap verilebilecek ölçütler kadar geniş olabilir. Son fakat en az değil, bir soruyu moderatör dikkatini çekmenin en iyi yolu onu işaretlemektir. Buradaki yorumunuz büyük olasılıkla 20 üzerinde saymayı bastırarak bir otomatik bayrak açmadıysa fark edilmezdi.
Adam Lear

Burada yaklaşık 10 yorum vardı, hepsi nereye gitti?
RyanW

Hedeflerine uygun bir çözüm buldum. SO hakkında başka bir cevap olarak var: stackoverflow.com/questions/6508415/…
Jesse Webb

1
@AnnaLear Shawn ile aynı fikirdeyim. Bu sayfayı yalnızca Google üzerinden buldum. Aşağıdaki yanıtların neredeyse hepsinin YEDEK yığın taşma bağlantılarını içerdiğini unutmayın. Bana göre hacimlerden bahsediyor, bu yüzden ilk etapta orada kalmalıydı.
Rebecca,

Yanıtlar:


23

Bu işi bitirme yöntemimi paylaşacağım, asıl sorunun bir parçasıydı.

İlk olarak, karşılaştığım sorunlar:

  1. CustomErrors açıkken (yani üretimde) global HandleErrornitelik istisnaları yutar ve hata görünümünüzü oluşturur, ancak elmah asla göremediğinden, onu elmah gibi bir addon aracıyla kaydedemezsiniz. Sanırım sizin görüşünüze göre giriş yapabilirsiniz, ama bu yanlış görünüyor. Genel HandleError özelliği, MVC 3 RTM Visual Studio proje şablonunda yeni görünür.

  2. MVC bitiş noktaları için url'leri olan customErrors 302 durum kodunu döndürür. Redirectmode özelliği var, ancak customErrors içindeki mvc url'leriyle eşleşemez ve ResponseRewrite modunu kullanırsınız. ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265 )

  3. CustomError'lardan tamamen kaçınmak ve uygulamanızdaki her şeyin özel olarak ele alınması IMO'nun çok karmaşık olmasına neden olur. (Bunu sevdim: https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 , ancak projemiz için doğru değildi)

Çözümüm

MVC'yi tamamen denklemden çıkarttım. HandleErrorAttributeGlobal.asax'daki global filtreyi kaldırdım ve tamamen customErrors yapılandırmasına odaklandım, WebForm yönlendirmelerini kullanmaya ResponseRewriteve 302 HTTP yanıt kodlarını önlemek için yönlendirme moduna değiştirmeye odaklandım .

<customErrors mode="On" defaultRedirect="/Error.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="/NotFound.aspx" />
</customErrors>

Ardından, NotFound.aspxpage_load olayında, Response.StatusCode404'ü ayarlayın ve Error.aspx'te 500 kodunu ayarlayın.

Sonuçlar:

Her ikisi için de hedefler Elmah kayıtları, kullanıcı dostu hata sayfası ve durum kodunda bir satır kod içeren durum kodu ile gerçekleştirildi. Önceki çözümde olduğu gibi bunu "MVC Yolu" olarak yapmıyoruz, ancak iki satır kod varsa, bununla iyiyim.


5

MVC, ASP ve en sevdiğiniz günlüğe kaydetme / istisna işleme çerçevesinin hedeflerinizi oldukça iyi karşılayabileceğini düşünüyorum. Hem ELMAH hem de Enterprise Library, istisnasız kullanım ve günlüğe kaydetme işlemlerinin kolay kullanılmasını sağlar, bu yüzden en sevdiğiniz öğeyi seçin.

NOT: dostça bir hata sayfası görüntüleyemezsiniz ve sorunuzun önerdiği gibi bir HTTP 404 veya 500 döndüremezsiniz. Dostça bir hata sayfası döndürdüğünüzde, tarayıcınıza döndürülen HTTP kodu 302 olacaktır. Bu, dostça hata sayfasına bir yönlendirmedir.

Dost Hata Sayfaları

Bir süredir ASP.net’in bir parçası olan iyi moda web.config ayarlarıyla hedeflerinize ulaşabileceksiniz. Geliştirme sırasında hata ayıklama bilgilerini göstermeyi ve üretimde dostça sayfaları göstermekten bahsediyorsunuz. Bunun için web.config'ün özel hatalar bölümünü kullanabilirsiniz (Hata ayıklama bilgilerini göstermek için CustomErrors = "Off" ayarla). Bunu okumamışsanız, CustomErrors niteliğini bildiğinizi varsayalım:

http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx

Hangi hata görünümlerini görüntüleyeceğiniz konusunda daha fazla kontrol düzeyine ihtiyacınız varsa, MVC'nin HandleError Özniteliğini kullanın. Bu şekilde, her bir Eylem / Denetleyici için farklı hata görünümleri seçebilirsiniz.

http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx

İstisna Günlüğü

Tüm istisnalarınıza aynı şekilde yanıt vermek istediğiniz gibi gözüküyor ('Hataları günlüğe kaydet ve üretimdeki yöneticiye e-postayla gönder'). Bu durumda, en basit seçeneğiniz kod eklemek

Application_Error (nesne gönderen, EventArgs e)

global.asax’ınızda Seçtiğiniz kayıt çerçevesine geçebileceğiniz yer burasıdır.

İstisna günlüğü / kullanımınız üzerinde daha fazla kontrol sahibi olmak istiyorsanız, HandleErrorAttribute öğesini alt sınıflandırabilir ve geçersiz kılabilirsiniz.

OnException(System.Web.Mvc.ExceptionContext filterContext)

bu, seçtiğiniz kayıt çerçevesine geçebileceğiniz başka bir yer.

https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror

Bu size yukarıda belirtilen Application_Error tekniğinden daha fazla kontrol sağlar.

Genel olarak MVC, hataların nasıl ele alınacağı konusunda size büyük bir kontrol hassasiyeti verir. Bu kontrole ihtiyacınız yoksa, ASP.NET'e web.config'inizdeki hata sayfalarını tanımlama gibi şeyler yapmanın yollarını geri alabilirsiniz.


Düşüncelerinizi eklediğiniz için çok teşekkürler. Orijinal ASP.NET ekibi tarafından 302 durum kodunun kötü tasarım seçimi olduğunu düşünüyorum. Buna cevaplarımda da gireceğim, bunu yapmak için bazı seçenekler var. MVC dünyasındaki bazılarının customError'ları tamamen terk ettiği ve uygulamanın hepsini daha iyi yeniden kullanılabilirlik ve sizin belirttiğiniz gibi daha fazla kontrol için uygulamada kullandığı görülüyor. Ancak bunları uygulamada sınırlı bir başarı elde ettim ve daha iyi pişirilmiş gibi görünen bir çok kod ekledim. Aşağıdaki cevaplarımda daha fazlası.

Ben ben bir her şeyi, hatta hata husul giriş yapabilirsiniz biliyorum bu şekilde, günlük tutma OnException yöntemi geçersiz tercih Ajax çağrısı i edecektir bulmak değil senin Application_Error tetikleyebilir.
Alicia,

@Alicia tam örnek kod?
Kiquenet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.