it-swarm.asia

ASP.NET MVC 3'te özel Hata İşleme için kesin yönergeler nelerdir?

ASP.NET MVC (bu durumda 3) özel hata işleme yapma işlemi inanılmaz derecede ihmal gibi görünüyor. Burada çeşitli soru ve cevapları okudum, internette, çeşitli araçlar için yardım sayfaları (Elmah gibi), ama tam bir daire içinde olduğumu hissediyorum ve hala en iyi çözüme sahip değiliz. Yardımınızla, belki de hata işleme için yeni bir standart yaklaşım belirleyebiliriz. İşleri basit tutmak istiyorum ve buna fazla mühendislik yapmamak istiyorum.

İşte hedeflerim:

Sunucu hataları/istisnalar için:

  1. Hata ayıklama bilgilerini geliştirmede görüntüle
  2. Üretimde kolay hata sayfası görüntüleme
  3. Hataları günlüğe kaydedin ve üretimdeki yöneticiye e-postayla gönderin
  4. 500 HTTP Durum Kodu döndür

404 Bulunamadı hataları için:

  1. Kolay hata sayfası göster
  2. Hataları kaydedin ve bunları üretimdeki yöneticiye e-postayla gönderin
  3. 404 HTTP Durum Kodu döndür

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

44
RyanW

Bunu yapmanın yolunu paylaşacağım, bu orijinal sorunun bir parçasıydı.

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

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

  2. mVC uç noktaları için url içeren 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 kullanamazsınız. ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265 )

  3. CustomErrors'lardan tamamen kaçınmak ve uygulamanızdaki özel her şeyi işlemek, IMO'nun çok karmaşıklığına yol açar. (Bunu sevdim: https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 , ama değildi projemiz için doğru değil)

Çözümüm

MVC'yi tamamen denklemden çıkardım. Global.asax'ta HandleErrorAttribute global filtreyi kaldırdım ve 302 HTTP yanıt kodundan kaçınmak için WebForm yönlendirmelerini kullanmak ve yeniden yönlendirme modunu ResponseRewrite olarak değiştirmek için tamamen customErrors yapılandırmasına odaklandım. .

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

Daha sonra NotFound.aspx page_load etkinliği, Response.StatusCode ila 404 ve Error.aspx içinde 500 kodunu ayarlayın.

Sonuçlar:

Her ikisinin de hedeflerine Elmah günlükleri, kolay hata sayfası ve durum kodunda kod satırlarında bir kod satırı ile ulaşıldı. Biz daha önceki çözüm yaptığı gibi "MVC Way" yapmıyoruz, ama iki kod satırı ise ben iyiyim.

23
RyanW

Ben MVC, ASP ve en sevdiğiniz günlük/istisna işleme çerçevesi hedeflerinizi oldukça iyi işleyebilir düşünüyorum. ELMAH ve Enterprise Library hem istisna işleme ve günlük kullanımı kolay sağlamak bu yüzden favori seçin .. I burada her birinin artıları ve eksileri içine girmeyeceğim.

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

Kolay Hata Sayfaları

Bir süredir ASP.net'in bir parçası olan iyi 'ol fashioned web.config ayarlarıyla hedeflerinize ulaşabileceğiniz anlaşılıyor. Geliştirme sırasında hata ayıklama bilgilerini göstermeyi ve üretimde kolay sayfalar göstermeyi belirtiyorsunuz. Bunun için web.config dosyasının özel hatalar bölümünü kullanabilirsiniz (Hata ayıklama bilgilerini göstermek için CustomErrors = "Off" olarak ayarlayın). Bunu okumazsanız, CustomErrors özniteliğini bildiğinizi varsayacağım:

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

Hangi hata görüntülemelerini görüntülediğiniz üzerinde daha fazla denetime ihtiyacınız varsa, MVC'nin HandleError Özniteliğini kullanın. Bu şekilde, her 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 anlaşılıyor ('Günlük hataları ve bunları üretimdeki yöneticiye e-postayla gönderin'). Bu durumda, en basit seçeneğiniz kod eklemek

Application_Error (nesne göndericisi, EventArgs e)

global.asax'ınızda. Seçtiğiniz günlük çerçevesine buradan geçebilirsiniz.

İstisna günlüğü tutma/işleme üzerinde daha fazla kontrol istiyorsanız, HandleErrorAttribute öğesini alt sınıflandırabilir ve geçersiz kılabilirsiniz

OnException(System.Web.Mvc.ExceptionContext filterContext)

bu, seçtiğiniz günlüklendirme çerçevesine geçebileceğiniz başka bir yerdir.

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

Bu, 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 denetim düzeyi sağlar. Bu kontrole ihtiyacınız yoksa, web.config dosyasındaki hata sayfalarını tanımlama gibi şeyler yapmanın ASP.net yollarına geri dönebilirsiniz.

5
nixon