Frage

In zwei verschiedenen Anwendung, der eine ein Brauch, den anderen die Probe MVC Anwendung, die Sie mit einem neuen VS2008 MVC-Projekt zu bekommen, [Handle] nicht Ausnahmen zu kontrollieren.

In der Beispielanwendung habe ich:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw new Exception();
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

das ist nur die Standard-Controller mit einer Ausnahme für den Test geworfen.

Aber es funktioniert nicht. Statt auf den Standard error.aspx Seite geht es zeigt die Debug-Informationen im Browser.

Das Problem abgeschnitten zuerst in einer benutzerdefinierten Anwendung bis ich an dem ich arbeiten führte mich mit der Beispielanwendung zu testen. Denken sie etwas mit Veränderungen zu tun hatte ich in der benutzerdefinierten Anwendung gemacht, verließ ich die Beispielanwendung völlig unverändert, mit Ausnahme (igitt) des Wurfes in der Index-Methode.

Ich bin ratlos. Was bin ich?

War es hilfreich?

Lösung

In Web.config, Custom ändern:

<system.web>
  <customErrors mode="On">
  </customErrors>

Wenn Modus entweder Aus oder Remoteonly ist, dann werden Sie den gelben Schirm des Todes sehen, anstatt die benutzerdefinierte Fehlerseite. Die Argumentation ist, dass Entwickler in der Regel die detailliertere Informationen über den gelben Schirm des Todes wollen.

Andere Tipps

Wichtig: Achten Sie darauf, dass Ihre Fehlerseite selbst keinen Fehler auf es hat

Ist dies der Fall werden Sie mit dieser ASP.NET benutzerdefinierten Fehlerseite am Ende und am Ende geht im Kreis und Haareausreißen. Streifen Sie einfach alles aus der Seite, die möglicherweise einen Fehler verursachen könnten und testen Sie es.

Auch in Bezug auf ‚custom‘ ist ON oder OFF gibt es mehrere Faktoren, ob oder nicht die freundliche Fehlerseite (Ihre Errors.aspx) Seite wird gezeigt werden oder nicht.

Siehe Blog (außer unten)

  

HttpContext.IsCustomErrorEnabled - schaut auf drei verschiedenen Quellen

     
      
  1. Die web.config der Sektion von Einzelhandelsimmobilien. Das ist ein   nützliche Eigenschaft zu setzen, wenn die Bereitstellung von   Ihre Anwendung in einer Produktions   Server. Dies hat Vorrang vor allen anderen   Einstellungen für benutzerdefinierte Fehler.
  2.   
  3. Die web.config der Bereich von mode-Eigenschaft. diese Einstellung   zeigt an, ob benutzerdefinierte Fehler sind   überhaupt aktiviert ist, und wenn ja, ob sie   nur für Remote-Zugriffe aktiviert sind.
  4.   
  5. Die IsLocal-Eigenschaft des Httprequest-Objekt. Wenn benutzerdefinierte Fehler aktiviert   nur für Remote-Zugriffe, müssen Sie   wissen, ob die Anforderung von a   Remote-Computer.
  6.   

hier Die Idee ist, dass Sie ‚Custom‘ ausgeschaltet während der Entwicklung haben können -., Wenn Sie die Fehler sehen wollen, und es dann ermöglichen, für die Produktion nur

Das MSDN-Artikel bespricht das Attribut weiter.

Ein weiterer Grund für dieses Problem kann sein,

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

Wenn Master-Seite alle Bildschirmtextsystem zugreifen es NULL-Verweis Ausnahme ausgelöst wird, dann wird die error.aspx nicht angezeigt werden.

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

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

Ich habe mit diesem als auch zu kämpfen und ich glaube, ich das Problem verstehe jetzt.

kurz in den Anforderungen für mit [HandleError] wie erwartet sind:

Sie müssen benutzerdefinierte Fehler in web.config aktivieren und Sie müssen auch angeben, wo Ihre Fehleransicht im <customErrors>-Tag ist.

Beispiel:

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

off Verlassen des defaultRedirect="Error" Teil ergeben wird stattdessen einen 500-Fehler im Browser. - nicht die ASP.NET-Fehlerseite (YSOD)

Auch müssen Sie nicht in Release-Modus. Getestet habe ich diese mit einem Debug-Build und es funktionierte gut.

Meine Umgebung war Visual Studio 2010 .NET 4 und mit dem Standard, "ASP.NET MVC 2 Web Application" Projektvorlage.

Was mich verwirrt die MSDN-Dokumentation für die HandleErrorAttribute Klasse war. Es muss nicht explizit sagen, dass Sie auf benutzerdefinierte Fehler in web.config aktivieren. Und ich nahm alles, was ich brauchte, war das [Handle Error] Attribut.

Es gibt einige dumme Situation, die einmal mit mir passiert ist, so könnte für jemanden hilfreich sein.

Seien Sie sicher, dass Sie <customErrors mode="On" /> auf die richtig web.config Datei hinzugefügt haben.


Manchmal (vor allem, wenn man mit so etwas wie ReSharper arbeiten und Ihre Dateien öffnet mit ihrem Namen eingeben, aber nicht über Mappen-Explorer), können Sie einfach ein web.config öffnen entweder von Ansichten Ordner oder sogar von einem anderen Projekt.

Achtung: in meinem Fall habe ich die HandleError Attribut eine exception innerhalb der Controllers Konstruktor geworfen zu fangen! Natürlich wird es sie nicht fangen. Das HandleError Attribut fängt nur Ausnahmen innerhalb Controller geworfen Aktionen . Es ist direkt in der MSDN-Seite (ich sollte mehr Beachtung geschenkt):

  

Stellt ein Attribut, das verwendet wird, um eine Ausnahme zu behandeln, die ist   durch eine Aktion-Methode ausgelöst.

Eine andere Sache, die geschah, ist, dass die OnException(ExceptionContext exceptionContext) überschrieben Methode des Controllers wurde nie aufgerufen wird. Nochmal:. Es wäre natürlich nicht genannt werden, da ich in dem Controller Konstruktor eine Ausnahme wirft

Ich habe 1 Stunde versucht, dies herauszufinden. : O) Hoffe, dass es die nächste Seele hilft ...

Als Hinweis: Denken Sie daran, dass die HandleError Attribut nur 500 Fehler abfängt. Für die anderen sollten Sie die <customErrors> Abschnitt in Web.config:

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>
scroll top