2016-03-23 17 views
1

Alınan hataya bağlı olarak belirli görünümleri görüntülemem için hata işleme gerçekleştiren bir kodum var.C# MVC Başarılı Http Durum Kodunu Belirle

Benim kod şöyle görünür:

protected void Application_EndRequest() 
    { 
     var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode); 
     if (!response.IsSuccessStatusCode) 
     { 
      var rd = new RouteData(); 
      IController c = new ErrorController(); 
      switch (response.StatusCode) 
      { 
       case HttpStatusCode.BadRequest: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "BadRequest"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.NotFound: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "NotFound"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.InternalServerError: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "InternalServerError"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.Forbidden: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "Forbidden"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       default: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "GenericError"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
      } 
     } 

Bu standart, http durum kodları için çalışır gibi belgelerinde tanımlandığı ve 200-299 tepki kodu ele almak doesnt ve geçer. Bununla birlikte, sorum şu, bunu yapmanın en iyi yolu bu mu?

Bu, 302 durum kodunu döndüren isteklerimden biri oldu - Bulundu. Şimdi, belgelere göre, bu başarılı bir kod olarak sınıflandırılmayacak, ancak nasıl başarılı olarak sınıflandırılamayacağını göremiyorum.

Bu nedenle, sadece 200-299 yerine tüm başarılı kodları hesaba katmak için bunu yapmanın daha iyi bir yolu var mı?

Teşekkürler Herhangi bir girdi ve fikir için teşekkürler. Anladığım kadarıyla bunun kesin bir cevabı olmayabilir.

eğer deyimi değiştirmektir orada 1 öneri olur koymak: 4xx kodları istemci hataları ve 5xx kodları sunucu hataları olarak tanımlanır olarak tanımlanır çünkü

if(!(statuscode >= 400 && statuscode <= 599) 

budur. Bu nedenle hepsini yakalamalı mı?

Ama korkmuş 418 hakkında ne yapmalı? :)

Ben httpErrors kullanarak çalıştılar

DÜZENLEME: web.config'de

<httpErrors errorMode="Custom" existingResponse="Replace"> 
    <clear/> 
    <error path="/Error/NotFound" responseMode="ExecuteURL" statusCode="400"/> 
</httpErrors> 

yanı sıra customErrors:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
    <error statusCode="403" redirect="~/Error/Forbidden" /> 
    <error statusCode="500" redirect="~/Error/InternalServerError" />   
</customErrors> 

Hem hiçbir şans

+0

Bunu sadece [web.config] 'da (http://benfoster.io/blog/aspnet-mvc-custom-error-pages) yapabileceğinizi biliyor musunuz? – Smudge202

+0

IIS7 + kullanıyor musunuz? Varsa, yalnızca httpErrors ile çalışmayı deneyin. – Chris

+0

Onları ayrı ayrı denedim. Iis – DaRoGa

cevap

1

ile Tüm erro'yu kapsamak zorunda değilsiniz. r kodları (400'den 500'e kadar).

göz at: Which HTTP Status Codes to cover for MVC error handling

Ve yerine Application_EndRequest() ne yaptığını ait boru hattında halihazırda işleyicileri kullanmak daha iyidir. Bununla demek istediğim, web.config dosyasında <httpErrors ... ve/veya <customErrors kullanmanızdır. <customErrors>, <customErrors> yapılandırdığında, IIS'yi <httpErrors> yapılandırır.NET Kaynak: How to add a default error page using httpErrors

Örnek: How can I properly handle 404 in ASP.NET MVC?

diğer büyük madde: Demystifying ASP.NET MVC 5 Error Pages and Error Logging

Bu makale ayrıntıları açıklamak nasıl düzgün kurulum 404 ve 500: Custom error pages in ASP.NET MVC. Easy, right?

+0

'un daha eski bir sürümünü kullanmam gerektiğine inanıyorum Daha fazla açıklar mısınız lütfen. Ben CustomErrors daha önce kullanmaya çalıştım ve bu yüzden bu yüzden ben bu yaklaşımla gittim – DaRoGa

+0

benim cevap düzenledim, google biraz isteyebilirsiniz, bu ortak bir sorudur. – Chris

+0

benim düzenleme görüyorum – DaRoGa

1

Eh ben emin değilim Hata kodları, ancak kodu kopyalayıp yapıştırmamalısınız.

Bunun yerine bir işlev oluşturun.

protected void Application_EndRequest() 
{ 
    var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode); 

    if (!response.IsSuccessStatusCode) 
    { 
     switch (response.StatusCode) 
     { 
      case HttpStatusCode.BadRequest: 
       ErrorAction("BadRequest"); 
       break; 
      case HttpStatusCode.NotFound: 
       ErrorAction("NotFound"); 
       break; 
      case HttpStatusCode.InternalServerError: 
       ErrorAction("InternalServerError"); 
       break; 
      case HttpStatusCode.Forbidden: 
       ErrorAction("Forbidden"); 
       break; 
      default: 
       ErrorAction("GenericError"); 
       break; 
     } 
    } 
} 

// Sends a request to the ErrorController 
private void ErrorAction(string action) 
{ 
    var rd = new RouteData(); 
    IController c = new ErrorController(); 

    Response.Clear(); 

    rd.Values["controller"] = "Error"; 
    rd.Values["action"] = action; 

    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
} 

Bu kod tümüyle farklı ErrorController eylemleri ortadan kaldırmak ve sadece tek bir eylem yöntemine sorgu dizesindeki statusCode geçebileceği ileri sürmektedir.

+0

Ben kod rafine değildir ve çoğaltılmış kodu önlemek için temizlik ihtiyacı katılıyorum, sadece henüz bunu yapmak için şans vardı ve düşünceler almak istedim. Bu yaklaşımı beğendiğim gibi nasıl önerildiğini yeniden gözden geçireceğim. Ancak, bunun işi yapmak için uygun bir çözüm olabileceğine inanıyor musunuz yoksa daha iyi/daha rafine bir yöntem mi var? – DaRoGa

+0

@Chris başka bir cevapta yazdığı gibi, bu kodu yazmanıza gerek yoktur. MVC, web.config dosyasındaki hataları işliyor. Http://stackoverflow.com/questions/717628/asp-net-mvc-404-error-handling – buffjape

+0

PS sayfasına bakın. Temizlenmesi gereken kod yazmayı denemeyin. :-) – buffjape

İlgili konular