2009-06-15 3 views
15

Ich glaube, ich habe unsere MVC App eingerichtet, [HandleError] richtig zu verwenden. Das ist mein Controller:ASP.NET MVC HandleError funktioniert nicht (customErrors ist auf "On" eingestellt)

[HandleError] 
public class SupportController : BaseController { 

    public ActionResult Toss() { 
     throw new Exception("uh oh"); 
    } 
    // snip 
} 

Und ich gesetzt in web.config meinen customErrors Tag habe auf "On":

<customErrors mode="On"></customErrors> 

Ich bin jedoch immer noch das Gelb Screen of Death auf Ausnahmen zu bekommen. Das Festlegen eines Haltepunkts in meiner Toss() Aktion zeigt, dass HttpContext.IsCustomErrorEnabled auf True festgelegt ist.

Wir machen nichts mit der View Engine, und die BaseController macht auch nichts durcheinander (und andere Controller, die es nicht erweitern, haben das gleiche Problem).

Ich entwickle unter Windows XP und habe das gleiche Problem, wenn die App auf einem Server 2003-Box (IIS 6) bereitgestellt wird.

Ich glaube nicht, gibt es eine Ausnahme auf der error.aspx Seite:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
</asp:Content> 

Eine Sache, die unterschiedlich sein kann, ist, dass diese App wurde erstellt zurück, wenn MVC Beta die neueste Version war, und wurde auf die aktualisierte RC und dann RTM, wie sie veröffentlicht wurden. Könnte es da etwas verrücktes Setting gegeben haben, das von dort übrig geblieben ist?

Ich kann dies auf andere Anwendungen arbeiten, so bin ich ein wenig verwirrt.

+0

Ist Ihre Seite error.aspx in ~ \ Views \ Support oder ~ \ Views \ Shared? – Talljoe

+0

~ \ Views \ Shared - sogar versucht [HandleError (View = "~/Ansichten/Shared/Error.aspx")] (hat nicht funktioniert) – swilliams

Antwort

19

Dies passiert, wenn es ein Problem bei der Verarbeitung der Fehlerseite gibt .. Wenn Sie die App debuggen, direkt nach der ersten Ausnahme wird ein anderes Problem (Ausnahme von der Fehlerseite) .. Ich hatte dies passiert und Der Grund für mich war, dass ich eine stark typisierte Masterseite hatte, die Fehlerseite diese Masterseite verwendet und da die Masterseite dasselbe Modell wie die tatsächliche Seite hat, erhielt die Masterseite ein HandlerErrorInfo-Modell anstelle des typisierten Modells Ich erwarte ..

Persönlich denke ich, das ist ein armes Design in der asp.net mvc (zusammen mit dem Rest davon), aber Sie können so leicht genug umgehen, indem Sie nicht die gleiche Masterseite verwenden (Sie könnten sogar Masterpage-Vererbung, bei der Sie eine stark typisierte Masterseite geerbt haben, die rein i übernimmt die Schicht von der untypisierten.

Sonst ist dies eine Art Ausnahme in der Fehleransicht .. (am wahrscheinlichsten).

+1

Sie waren nicht 100% richtig, aber Sie haben mich auf dem richtigen Weg . Die Masterseite hat kein Modell, aber sie tut einiges, was vermutlich eine Null-Referenz-Ausnahme auslöst. Die Verwendung einer nicht masterweisen Ansicht funktioniert. Vielen Dank! – swilliams

+1

Glücklich, zu helfen, viele Kopfschmerzen Punkte in asp.net mvc, ich scheinen zu finden, sie und dachte, ich sollte jemanden einige "Kopf bis Tastatur Auswirkungen" Aktionen speichern. :) – meandmycode

+0

eine Weile seit diesem Beitrag, aber es war hilfreich fällig für mich auch – Craig

2

Ein weiterer Grund für dieses Problem sein kann,

In Template MVC-Anwendung (erzeugt durch VS2008/VS2008 Express), Error.aspx (erzeugt durch VS) verwendet Master-Seite.

Wenn die Masterseite auf ViewData zugreift, wird die Nullreferenz Exception ausgelöst, dann wird die error.aspx nicht angezeigt.

Mit diesem einfachen Code als Error.aspx, wird es das Problem, (zusammen mit Custom = On)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
+0

Ja, das war das Problem für mich, danke. –

0

Nach vielen Haareziehen, löst ich fand, dass mein Problem in die allgemeine Kategorie fällt von "Ausnahme vom Code werfen", um beim Rendern der Fehleransicht einen weiteren Fehler auszulösen."Ich hatte zuvor eine stark typisierte Fehlerseite geschrieben, in der ich eine System.Exception erwartete. Als ich dann das Attribut [HandleError] verwendete, übergab der Filter die Fehlerseite eine System.HandleErrorInfo. Die zweite Ausnahme trat an dieser Zeile auf (in Default.aspx.cs).

httpHandler.ProcessRequest(HttpContext.Current); 

Verwirrende

1

hatte ich eine gleiche Problem, und nach der Untersuchung fand ich, dass ich die web.Debug.config Datei unter web.config wurde die Aktualisierung

Dann habe ich die. das CustomErrors Tag in der Datei web.config und es wurde gearbeitet g für mich.

0

Ich lief immer in ein ähnliches Problem. Mit diesem "Hack" konnte ich ein wünschenswertes Ergebnis erzielen.

Da alle meine Controller einen BaseController erweitern, funktioniert dies überall.

public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 

     Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>"); 

     base.OnException(filterContext); 

    } 

} 
3

Wenn Sie IE9 verwenden, gibt es ein anderes Problem. Es scheint, IE9 die Fehlerseite verstecken, wenn es weniger als 1 KB ist, wie in den:

asp-net-mvc-3-handleerror-global-filter-always-shows-iis-status-500-page

Seien Sie sicher, dass Inhalt Körper mehr als 1 Kb Länge ist. Versuchen Sie, diese am Ende der Fehlerseite hinzufügen:

@ (new String (‘‘, 1000))

+0

Nicht nur in IE9. Ich habe IE8 und erlebe das gleiche Verhalten. – rivarolle

1

ich in ein ähnliches Problem vor kurzem lief. Es stellte sich heraus, dass die Methode in der Steuerung, die die Ausnahme auslöst (HomeController), von einer Methode in einem anderen Controller (DispatchController) aufgerufen wurde.

Wir mussten die Eigenschaft [HandleError] auf dem aufrufenden Controller platzieren, um es zum Laufen zu bringen.

[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")] 
public class DispatchController : Controller 
{ 

Wir haben auch die benutzerdefinierte Fehleransicht in der Ordnerstruktur für den aufrufenden Controller platziert.
View folder showing custom error view in the Dispatch controller folder

Verwandte Themen