Benutzerdefinierte ASP.NET MVC-Anwendungsfehlerseiten werden in der gemeinsam genutzten Hostingumgebung nicht angezeigt

Ich habe ein Problem mit benutzerdefinierten Fehlern in einer ASP.NET MVC-App, die ich auf meinem freigegebenen Host bereitgestellt habe. Ich habe einen ErrorController erstellt und Global.asax den folgenden Code hinzugefügt, um nicht behandelte Ausnahmen abzufangen, zu protokollieren und dann die Steuerung an den ErrorController zu übertragen, um benutzerdefinierte Fehler anzuzeigen. Dieser Code stammt vonHier:

protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    Response.Clear();

    HttpException httpEx = ex as HttpException;
    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");

    if (httpEx == null)
    {
        routeData.Values.Add("action", "Index");
    }
    else
    {
        switch (httpEx.GetHttpCode())
        {
            case 404:
                routeData.Values.Add("action", "HttpError404");
                break;
            case 500:
                routeData.Values.Add("action", "HttpError500");
                break;
            case 503:
                routeData.Values.Add("action", "HttpError503");
                break;
            default:
                routeData.Values.Add("action", "Index");
                break;
        }
    }

    ExceptionLogger.LogException(ex); // <- This is working. Errors get logged

    routeData.Values.Add("error", ex);
    Server.ClearError();
    IController controller = new ErrorController();
    // The next line doesn't seem to be working
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

Application_Error wird definitiv ausgelöst, da die Protokollierung einwandfrei funktioniert. Anstatt meine benutzerdefinierten Fehlerseiten anzuzeigen, erhalte ich die allgemeinen Go Daddy-Seiten. Aus dem Titel des Blogposts, aus dem der obige Code stammt, habe ich festgestellt, dass er Release Candidate 2 des MVC-Frameworks verwendet. Hat sich in 1.0 etwas geändert, durch das die letzte Codezeile nicht funktioniert? Wie immerFunktioniert hervorragend auf meinem Computer.

Vorschläge werden sehr geschätzt.

Bearbeiten: Ich habe vergessen zu erwähnen, dass ich alle 3 Möglichkeiten für den customErrors-Modus in der Datei Web.config ausprobiert habe (Off, On und RemoteOnly). Gleiche Ergebnisse, unabhängig von dieser Einstellung.

Edit 2: Und ich habe es auch mit und ohne die [HandleError] -Dekoration auf den Controller-Klassen versucht.

Update: Ich habe die 404s herausgefunden und repariert. Es gibt einen Abschnitt des Einstellungsfensters in Go Daddys Hosting Control Center, in dem das Verhalten von 404 gesteuert werden kann. Standardmäßig wird die generische Seite angezeigt, wodurch anscheinend alle Einstellungen in Web.config außer Kraft gesetzt werden. Meine benutzerdefinierte 404-Seite wird nun wie vorgesehen angezeigt. 500er und 503er funktionieren jedoch immer noch nicht. Ich habe Code im HomeController, um eine statische Textversion des Inhalts abzurufen, wenn Sql Server eine Ausnahme wie folgt auslöst:

public ActionResult Index()
{
    CcmDataClassesDataContext dc = new CcmDataClassesDataContext();

    // This might generate an exception which will be handled in the OnException override
    HomeContent hc = dc.HomeContents.GetCurrentContent();

    ViewData["bodyId"] = "home";
    return View(hc);
}

protected override void OnException(ExceptionContext filterContext)
{
    // Only concerned here with SqlExceptions so an HTTP 503 message can
    // be displayed in the Home View. All others will bubble up to the
    // Global.asax.cs and be handled/logged there.
    System.Data.SqlClient.SqlException sqlEx =
        filterContext.Exception as System.Data.SqlClient.SqlException;
    if (sqlEx != null)
    {
        try
        {
            ExceptionLogger.LogException(sqlEx);
        }
        catch
        {
            // couldn't log exception, continue without crashing
        }

        ViewData["bodyId"] = "home";
        filterContext.ExceptionHandled = true;
        HomeContent hc = ContentHelper.GetStaticContent();
        if (hc == null)
        {
            // Couldn't get static content. Display friendly message on Home View.
            Response.StatusCode = 503;
            this.View("ContentError").ExecuteResult(this.ControllerContext);
        }
        else
        {
            // Pass the static content to the regular Home View
            this.View("Index", hc).ExecuteResult(this.ControllerContext);
        }
    }
}

Hier ist der Code, der versucht, den statischen Inhalt abzurufen:

public static HomeContent GetStaticContent()
{
    HomeContent hc;

    try
    {
        string path = Configuration.CcmConfigSection.Config.Content.PathToStaticContent;
        string fileText = File.ReadAllText(path);
        string regex = @"^[^#]([^\r\n]*)";
        MatchCollection matches = Regex.Matches(fileText, regex, RegexOptions.Multiline);
        hc = new HomeContent
            {
                ID = Convert.ToInt32(matches[0].Value),
                Title = matches[1].Value,
                DateAdded = DateTime.Parse(matches[2].Value),
                Body = matches[3].Value,
                IsCurrent = true
            };
    }
    catch (Exception ex)
    {
        try
        {
            ExceptionLogger.LogException(ex);
        }
        catch
        {
            // couldn't log exception, continue without crashing
        }
        hc = null;
    }

    return hc;
}

Ich habe überprüft, dass der Code den Fehler ordnungsgemäß protokolliert, wenn ich die Verbindungszeichenfolge ändere, um eine SqlException zu generieren. Anschließend wird der statische Inhalt erfasst und angezeigt. Wenn ich aber auch den Pfad zur statischen Textdatei in Web.config ändere, um die 503-Version von Home View zu testen, erhalte ich stattdessen eine Seite mit nichts anderem als "Dienst nicht verfügbar". Das ist es. Keine benutzerdefinierte 503-Nachricht mit dem Erscheinungsbild der Site.

Hat jemand Vorschläge zur Verbesserung des Codes, die helfen könnten? Würde es helfen, der HttpResponse verschiedene Header hinzuzufügen? Oder hijackt Go Daddy die 503s?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage