Frage

meine Website für Google Webmaster-Tools-Setup Nach dem Versuch, fand ich, dass meine benutzerdefinierten ASP.NET-Seite 404 nicht wurde den 404-Statuscode zurück. Er zeigte die richtige benutzerdefinierte Seite und sagte dem Browser an, dass alles in Ordnung ist. Dies ist ein weiches 404 oder falsch betrachten 404. Bei Google ist nicht so. So fand ich viele Artikel über das Thema, aber die Lösung, die ich will nicht zu funktionieren scheint.

Die Lösung, das ich arbeiten will, ist, indem die folgenden zwei Zeilen in den Code hinter Page_Load-Methode der benutzerdefinierten 404-Seite.

Response.Status = "404 Not Found";
Response.StatusCode = 404;

Das funktioniert nicht. Die Seite gibt immer noch 200 OK. Ich fand jedoch, dass, wenn ich den folgenden Code ein Festcode in das Design-Code wird es richtig funktionieren.

<asp:Content ID="ContentMain" ContentPlaceHolderID="ContentPlaceHolderMaster" runat="server">

<%
    Response.Status = "404 Not Found";
    Response.StatusCode = 404;
%>

 ... Much more code ...

</asp:content>

Die Seite wird mit einer Masterseite. Und ich bin der Konfiguration benutzerdefinierte Fehlerseiten in meinem web.config. Ich würde wirklich lieber den Code hinter Option verwenden, aber ich kann nicht scheinen, um es ohne funktioniert eine der Hack Inline-Code in der Gestaltung / Layout zu setzen.

War es hilfreich?

Lösung

Lösung:

Das Problem, es stellte sich heraus, war die Verwendung der Masterseite. Ich habe es durch Setzen des Statuscode später in den Seiten-Lebenszyklus zu arbeiten, offensichtlich die Wiedergabe der Master-Seite wurde das Zurücksetzen es, so überwog ich die Methode machen und setzen Sie ihn nach dem Rendern vollständig war.

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.StatusCode = 404;
}

Mehr Arbeit getan werden könnte, um genau herauszufinden, wenn die Master-Seite wird der Status Einstellung, aber ich werde das auf Sie verlassen.


Original Beitrag:

ich in der Lage war, einen Test-Web-App zu bekommen gut zu funktionieren, und es zumindest angezeigt, um die benutzerdefinierten Fehlerseite und hat einen 404-Statuscode. Ich kann Ihnen nicht sagen, was mit Ihrer App falsch ist, aber ich kann Ihnen sagen, was ich getan habe:

1) Bearbeitet die web.config für benutzerdefinierte Fehler:

<customErrors mode="On">
  <error statusCode="404" redirect="404.aspx"/>
</customErrors>

2) Es wurde eine 404.aspx Seite und stellen Sie den Statuscode 404.

public partial class _04 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
    }
}

Das ist über es, wenn ich zu einem beliebigen Seite Verlängerung gehen, die von Asp.Net verarbeitet wird und nicht existieren, mein Fiedler Protokoll zeigt deutlich ein 404, hier ist der Header:

HTTP/1.1 404 Not Found
Server: Microsoft-IIS/5.1
Date: Sun, 07 Dec 2008 06:04:13 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 533

Nun, wenn ich auf eine Seite, die nicht von Asp.Net verarbeitet wird, wie eine htm-Datei, wird die benutzerdefinierte Seite nicht zeigen, und die 404, die von IIS konfiguriert ist, wird angezeigt.

Hier ist ein Beitrag, der in einige weitere Details geht, die Sie und Ihr Problem von Nutzen sein kann, hat mein Test auf die neue Seite eine Umleitung tun, um die URL der angeforderten Datei ist ziemlich viel verloren (außer seinen in der Query-String).

Google 404 und .NET Custom Error Pages

Rubrik Spy Antwort:

HTTP/1.1 404 Not Found
Date: Sun, 07 Dec 2008 06:21:20 GMT

Andere Tipps

Ich hatte ein ähnliches Problem, das ich mag eine benutzerdefinierte Seite als 404 zeigen (die ASPX ist) und es funktioniert auf localhost in Ordnung, aber sobald ein Fern Besucher verbunden, sie würden die allgemeine IIS 404 erhalten.

Die Lösung hierfür war hinzuzufügen

Response.TrySkipIisCustomErrors = true;

Vor dem Response.StatusCode ändern.

Gefunden über Rick Strahl http://www.west-wind.com/ weblog / posts / 745738.aspx

Die IIS 7-Lösung ist, einfach diese Datei zu Ihrer web.config hinzufügen:

<system.webServer>
  <httpErrors existingResponse="Replace">
    <remove statusCode="500" subStatusCode="-1" />
    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" prefixLanguageFilePath="" path="404.htm" responseMode="File" />
    <error statusCode="500" prefixLanguageFilePath="" path="500.htm" responseMode="File" />
  </httpErrors>
</system.webServer>

http://forums.asp.net/t/1563128.aspx/1

Versuchen Aufruf Response.End () Wiedergabe zu überspringen ...

Response.Status = "404 Not Found";
Response.StatusCode = 404;
Response.End();
return;

Nach zahlreichen Tests und Fehlerbehebung es scheint, dass bestimmter Hosting-Provider mit dem Return-Code stören kann. Ich war in der Lage, dies zu umgehen, indem ein „Hack“ in dem Inhalt anwenden.

<%
// This code is required for host that do special 404 handling...
Response.Status = "404 Not Found";
Response.StatusCode = 404;
%>

Damit wird die Seite des richtigen Rückgabecode egal zurückzukehren, was.

ich in der Lage war, um dieses Problem zu erhalten, indem Sie die folgenden Einstellung in asp.net Webformulare mit .NET 3.5 verwendet wird.

Das Muster I implementiert haben umgeht .NET des benutzerdefinierte Redirect-Lösung in der web.config wie ich meine eigenen geschrieben habe alle Szenarien mit dem richtigen HTTP-Statuscode im Header zu behandeln.

Zuerst die Custom Abschnitt web.config sieht wie folgt aus:

<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />

Diese Einstellung sorgt dafür, dass Custom-Modus eingestellt ist auf eine Einstellung wir später brauchen werden, und bietet ein All-else-nicht-Option für die defaultRedirect von error.htm. Dies ist praktisch, wenn ich nicht einen Handler für den spezifischen Fehler hat, oder gibt es etwas entlang der Linien einer gebrochenen Datenbankverbindung.

Zweitens, hier ist das globale asax Fehlerereignis:

protected void Application_Error(object sender, EventArgs e)
    {
       HandleError();
    }

    private void HandleError()
    {
        var exception = Server.GetLastError();
        if (exception == null) return;

        var baseException = exception.GetBaseException();

        bool errorHandled = _applicationErrorHandler.HandleError(baseException);
        if (!errorHandled) return;


        var lastError = Server.GetLastError();
    if (null != lastError && HttpContext.Current.IsCustomErrorEnabled)
    {
        Elmah.ErrorSignal.FromCurrentContext().Raise(lastError.GetBaseException());
        Server.ClearError();
    }
    }

Dieser Code wird das Bestehen der Verantwortung des Umgangs mit dem Fehler in einer anderen Klasse aus. Wenn der Fehler nicht behandelt wird und Customeingeschaltet ist, bedeutet, dass wir einen Fall haben, wo wir auf die Produktion sind und irgendwie ein Fehler nicht behandelt worden. Wir werden es hier zu löschen, um den Benutzer nicht sehen es, zu verhindern, aber es in Elmah einzuloggen, damit wir wissen, was los ist.

Die applicationErrorHandler Klasse sieht wie folgt aus:

public bool HandleError(Exception exception)
        {
            if (exception == null) return false;

            var baseException = exception.GetBaseException();

            Elmah.ErrorSignal.FromCurrentContext().Raise(baseException);

            if (!HttpContext.Current.IsCustomErrorEnabled) return false;

            try
            {

                var behavior = _responseBehaviorFactory.GetBehavior(exception);
                if (behavior != null)
                {
                    behavior.ExecuteRedirect();
                    return true;
                }
            }
            catch (Exception ex)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
            }
            return false;
        }

Diese Klasse im Wesentlichen verwendet das Befehlsmuster die entsprechende Fehlerbehandlungsroutine für die Art des Fehlers zu finden, die ausgegeben wird. Es ist wichtig, Exception.GetBaseException () auf dieser Ebene zu verwenden, da fast jeden Fehler wird in einer höheren Ebene Ausnahme gewickelt werden. Zum Beispiel tun „neue System.Exception werfen ()“ von jeder aspx Seite wird in einem HttpUnhandledException führt auf dieser Ebene empfangen wird, kein System.Exception.

Die "Fabrik" Code ist einfach und sieht wie folgt aus:

public ResponseBehaviorFactory()
    {
        _behaviors = new Dictionary<Type, Func<IResponseBehavior>>
                        {
                            {typeof(StoreException), () => new Found302StoreResponseBehavior()},
                            {typeof(HttpUnhandledException), () => new HttpExceptionResponseBehavior()},
                            {typeof(HttpException), () => new HttpExceptionResponseBehavior()},
                            {typeof(Exception), () => new Found302DefaultResponseBehavior()}
                        };
    }

    public IResponseBehavior GetBehavior(Exception exception)
    {                                                                               
        if (exception == null) throw new ArgumentNullException("exception");

        Func<IResponseBehavior> behavior;
        bool tryGetValue = _behaviors.TryGetValue(exception.GetType(), out behavior);

        //default value here:
        if (!tryGetValue)
            _behaviors.TryGetValue(typeof(Exception), out behavior);

        if (behavior == null)
            Elmah.ErrorSignal.FromCurrentContext().Raise(
                new Exception(
                    "Danger! No Behavior defined for this Exception, therefore the user might have received a yellow screen of death!",
                    exception));
        return behavior();
    }

Am Ende habe ich ein erweiterbares Fehlerbehandlung Schema Setup bekam. In jedem der „Verhaltensweisen“, die definiert ist, habe ich eine eigene Implementierung für die Art des Fehlers. Zum Beispiel wird eine Http Ausnahme für den Statuscode untersucht und entsprechend behandelt. Ein Statuscode 404 wird ein Server.Transfer anstelle einem Request.Redirect erfordern, zusammen mit dem entsprechenden Statuscode im Header geschrieben.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top