Después tratando de configurar mi sitio de Herramientas para Webmasters de Google me encontré con que mi Costumbre ASP.NET 404 página no devolver el código de estado 404. Se muestra el correcto de página personalizado y le dijo al navegador de que todo está bien. Esto se considera un soft 404 o falso 404. A Google no le gusta esto. Por lo que he encontrado muchos artículos sobre el tema, pero la solución que yo quiero no parecen trabajar.

La solución que se desea trabajar es la adición de las dos líneas siguientes el código detrás de método Page_Load de la página de error 404 personalizada.

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

Esto no funciona. La página todavía devuelve 200 OK. He encontrado, sin embargo, que si me duro código el código siguiente en el código de diseño que funcione correctamente.

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

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

 ... Much more code ...

</asp:content>

La página es el uso de una página maestra. Y yo soy la configuración de páginas de error personalizadas en mi web.config. Realmente, en lugar de utilizar el código detrás de la opción, pero me parece que no puede hacer el trabajo sin poner un hack de código en línea en el diseño /layout.

  • Lo que hace el navegador de estado? Yo uso el addon de Cabecera del Espía para Firefox.
  • Encabezado Espía Respuesta: HTTP/1.1 404 not Found Fecha: Sun, 07 Dec 2008 06:21:20 GMT
  • Usted está utilizando una página maestra? Tal vez eso es todo. Voy a tratar de una página sin necesidad de utilizar una página maestra…
  • No, yo no, pero puedo hacer una comprobación rápida así, yo voy a probar con uno.
  • Sí, eso es todo! La página maestra causado un 200 OK
  • Así que tengo que figura que fuera parte, se preguntan cómo arreglar?

InformationsquelleAutor Bobby Cannon | 2008-12-07

6 Comentarios

  1. 71

    Solución:

    El problema, resultó, era el uso de la página principal. Yo tengo que trabajar por establecer el estado código más adelante en las páginas del ciclo de vida, es evidente que la representación de la página maestra fue reiniciarlo, así que sobreescribimos el método render y la puso después de que el render era completa.

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

    Más trabajo se puede hacer para averiguar exactamente cuando la página principal es establecer el estado, pero se los dejo a ustedes.


    Post Original:

    Yo era capaz de conseguir una web de prueba de la aplicación para funcionar bien, así que al menos muestra la página de error personalizada y devolvió un código de estado 404. Yo no te puedo decir lo que está mal con su aplicación, pero te puedo decir lo que yo hice:

    1), Editado por la web.configuración personalizada de errores:

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

    2) se Añadió un 404.página aspx y establecer el estado código 404.

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

    Eso es, si puedo ir a cualquier página de extensión que es procesada por Asp.Net y no existe, mi violinista de registro muestra claramente un error 404, aquí está el encabezado:

    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

    Ahora si me voy a una página que no es procesado por Asp.Net como un archivo htm, la costumbre de la página no se muestra y el error 404 que se configura IIS se muestra.

    Aquí es un post que va a un poco más de detalles que pueden ser de utilidad para usted y su problema, mi prueba de hacer una redirección a la página nueva, por lo que la dirección url del archivo solicitado es bastante perdido (excepto en la cadena de consulta).

    Google 404 .NET Páginas de Error Personalizadas

    De Cabecera Del Espía Respuesta:

    HTTP/1.1 404 Not Found
    Date: Sun, 07 Dec 2008 06:21:20 GMT
    • Encabezado Spy es addon Encabezado de Espía para Firefox
    • ¿Cómo es este trabajo para la estática .html páginas de error personalizadas?
  2. 27

    He tenido un problema similar les quiero mostrar una página personalizada como un 404 (que es ASPX) y funcionó bien en localhost, pero tan pronto como un mando a distancia visitante conectado conseguirían el genérico de IIS 404.

    La solución a esto fue agregar

    Response.TrySkipIisCustomErrors = true;

    Antes de cambiar la Respuesta.StatusCode.

    Encontrar a través de Rick Strahl http://www.west-wind.com/weblog/posts/745738.aspx

  3. 12

    El IIS 7 solución es añadir esto a tu web.archivo de configuración:

    <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

    • Trabajó para mí! La única solución aquí que trabajó, probablemente debido a la versión que se nota… Ser consciente de Que sólo puede utilizar estática .archivos htm con esta solución.
    • Esto funcionó perfectamente! Gracias por la solución.
  4. 10

    Tratar de llamar a la Respuesta.End() para omitir la representación…

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

    Después de muchas pruebas y solución de problemas parece que ciertos proveedores de hosting puede interferir con el código de retorno. Yo era capaz de conseguir alrededor de esto, mediante la aplicación de un «hack» en el contenido.

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

    Esto permitirá la página para devolver el correcto código de retorno no importa qué.

  6. 1

    Yo era capaz de conseguir alrededor de este problema mediante la siguiente configuración en asp.net formularios web utilizando .NET 3.5.

    El patrón que he implementado omite .NETO de la costumbre de redirigir la solución en la web.config como he escrito en mi propio para manejar todos los escenarios con el código de estado HTTP correcto en el encabezado.

    Primera, la web.configuración sección customErrors se parece a esto:

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

    Esta configuración asegura que CustomErrors mode está ajustado en on, un parámetro que se necesitará en el futuro, y ofrece un todo-los demás-falla opción para el defaultRedirect error.htm. Esto será muy útil cuando no tengo un controlador para el error específico, o hay algo a lo largo de las líneas de rotura de la conexión de base de datos.

    Segundo, aquí está el mundial asax evento de Error:

    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();
        }
        }

    Este código está pasando fuera de la responsabilidad de manejar el error a otra clase. Si el error no es manejado y CustomErrors está encendido, significa que tenemos un caso en el que estamos en la producción y de alguna manera un error que no ha sido tratado. Vamos a aclararlo de aquí a fin de evitar que el usuario pueda ver, pero de registro en Elmah así que sabemos lo que está pasando.

    La applicationErrorHandler clase se parece a esto:

    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;
            }

    Esta clase esencialmente utiliza el modelo de comandos para localizar el error apropiado controlador para el tipo de error que haya sido emitido. Es importante el uso de la Excepción.GetBaseException() en este nivel, debido a que casi todos los errores serán envueltos en un nivel más alto de excepción. Por ejemplo, haciendo «tirar nuevo Sistema.Excepción()» desde cualquier página aspx se traducirá en un HttpUnhandledException, recibido en este nivel, no un Sistema.Excepción.

    De la «fábrica» de código es sencillo y se parece a esto:

    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();
        }

    Al final, he conseguido un extensible de error régimen de manejo de la instalación. En cada uno de los «comportamientos» que se define, tengo una implementación personalizada para el tipo de error. Por ejemplo, una excepción Http será inspeccionado por el código de estado y maneja adecuadamente. Un código de estado 404 requerirá de un Servidor.Traslado en lugar de una Solicitud.Redirigir, junto con el correspondiente código de estado escrito en el encabezado.

    Espero que esto ayude.

Dejar respuesta

Please enter your comment!
Please enter your name here