2011-09-01 22 views
10

Mam niestandardowych stron błędów konfiguracji za pomocąMVC InvalidOperationException z niestandardowych stron błędów

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/PageNotFound" /> 
</customErrors> 

Stworzyłem stronę, która zgłasza wyjątek i ja i przekierowanie do odpowiednich stron o błędach.

jednak jestem zauważać te błędy w ELMAH na serwerze internetowym produkcji:

System.InvalidOperationException Widok „Error” lub jego mistrz Nie znaleziono lub nie obsługuje silnik widok wyszukiwane lokalizacje. Przeszukiwano następujące lokalizacje: : ~/Obszary/Piłka nożna/Widoki/Szkic/Błąd.aspx ~/Obszary/Piłka nożna/Widoki/Szkic/Błąd.ascx ~/Obszary/Piłka nożna/Widoki/Współdzielone/Błąd.aspx ~/Obszary/Piłka nożna/Widoki/Shared/Error.ascx ~/Widoki/Draft/Error.aspx ~/Widoki/Draft/Error.ascx ~/Widoki/Shared/Error.aspx ~/Widoki/Shared/Error. ascx ~/Obszary/Piłka nożna/Widoki/Draft/Error.cshtml ~/Obszary/Piłka nożna/Widoki/Draft/Error.vbhtml ~/Obszary/Piłka nożna/Widoki/Shared/Error.cshtml ~/Obszary/Piłka nożna/Widoki /Shared/Error.vbhtml ~/Views/Draft/Error.cshtml ~/Widoki/Draft/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Widoki/Shared/Error.vbhtml

Dlaczego szuka strony z błędem w innym miejscu? Usunąłem ~/Views/Shared/Error.cshtml i dodałem moją własną stronę błędu w ~/Home/Error, ponieważ określiłem nową wartość domyślną w moim pliku konfiguracyjnym.

Wszelkie pomysły?

Dzięki.

+0

Ponieważ 'customErrors' jest coś z oferty ASP.NET (nie ASP .NET MVC), nie jest to najlepsze narzędzie do pracy. Richard Dingwall ma świetny post na ten temat: http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/ –

Odpowiedz

26

projekty MVC domyślnie dodaje HandleErrorAttribute w pliku

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

Global.asax.cs Filtr ten jest wykonywany podczas nieobsługiwany jest wyjątek. Ustawia widok jako Error. W związku z tym środowisko wykonawcze MVC próbuje renderować ten widok. Ale w twoim przypadku nie ma takiego widoku. Tak więc ponownie rzuca inny wyjątek, który jest obsługiwany przez środowisko wykonawcze ASP.NET i pokazuje stronę błędu, którą skonfigurowałeś w pliku Web.Config.

Można utworzyć własny filtr wyjątków i zarejestrować go.

+0

Dzięki, że masz rację, która wydaje się być dokładnie to, co się dzieje. Ponownie umieściłem domyślny widok błędu i wyrzuciłem wyjątek, że błąd dotyczący znalezienia domyślnego widoku zniknął. Jednak elmah nie rejestruje wyjątku. Nie mam problemu z używaniem domyślnego widoku, ale jak to się dzieje, że elmah nie rejestruje błędów? Loguje 404 tylko dobrze, ale nie błędy serwera 500. –

+2

@Aros - Musisz zaimplementować specjalną wersję HandleErrorAttribute dla Elmah. Możesz znaleźć przykład tutaj: http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx –

+0

Dzięki za komentarz na temat linii w odpowiedzi i polegam na niestandardowych błędach przekierowania z web.config. Skorzystam z odpowiedzi tutaj, jeśli to powoduje problemy. http://stackoverflow.com/questions/766610/how-to-get-elmah-to-work- with-asp-net-mvc-handleerror-attribute/779961#779961 Ktoś wie, dlaczego nie chciałbym komentować ten wiersz kodu? –

5

Skończyło się na usunięciu rejestracji HandleErrorAttribute w Global.asax i właśnie przy użyciu sekcji <customErrors>. ELMAH teraz poprawnie rejestruje błędy i mogę określić niestandardowe strony błędów.

Czy brakuje mi czegoś?

+0

Wydaje się, że pracuje dla mnie, sprawia, że ​​jestem lekko nerwowy, ale nie widzę w tym nic złego. – andrewb

+0

Pracowałem dla mnie używając niestandardowych błędów z StackExchange.Exceptional zamiast Elmah. – Gareth

0

Dla przyszłych czytelników tego posta należy pamiętać, że Elmah dodaje swoją własną HandleErrorAttribute, więc oczekuje również widoku Error.cshtml. Zauważ, że zainstalowałem również pakiet Elmah.MVC NuGet, ale jest on używany tylko do prawidłowego ustawienia.

Tak, właśnie zauważyłem, że na nuget.org Elmah.MVC jest odpowiedzialny za dodawanie HandleErrorAttribute:

Bezbolesne integracja funkcji ELMAH w ASP.NET MVC Aplikacji. Po prostu upuść pakiet wewnątrz ASP.Aplikacja NET MVC i URL dostępu/elmah. Zainstaluje także globalny filtr HandleError, , który gwarantuje, że wszystkie nieobsługiwane błędy są rejestrowane (nawet jeśli customError jest włączony "On").

1

Można również upewnić się, że HandleErrorAttribute nie jest zarejestrowany przez usunięcie go z globalnych filtrów metodą Remove:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Remove(new HandleErrorAttribute()); 
     /* ... your other filters */ 
    } 
} 
Powiązane problemy