Pregunta IIS7 anula CustomErrors al establecer Response.StatusCode?


Teniendo un problema extraño aquí. Todo el mundo sabe que si usas web.config's customErrors sección para hacer una página de error personalizada, que debe configurar su Response.StatusCode a lo que sea apropiado Por ejemplo, si hago una página 404 personalizada y la llamo 404.aspx, podría ponerle <% Response.StatusCode = 404 %> en los contenidos para que tenga un verdadero encabezado de estado 404.

Sígueme hasta ahora Bueno. Ahora intenta hacer esto en IIS7. No puedo hacer que funcione, punto. Si Response.StatusCode se establece en la página de error personalizado, IIS7 parece anular completamente la página de error personalizado y muestra su propia página de estado (si tiene una configurada).

¿Alguien más ha visto este comportamiento y quizás también sepa cómo evitarlo? Estaba trabajando bajo IIS6, así que no sé por qué las cosas cambiaron.

Nota: Esto no es lo mismo que el problema en ASP.NET Custom 404 que devuelve 200 OK en lugar de 404 no encontrado


94
2018-01-12 02:37


origen


Respuestas:


La forma más fácil de hacer que el comportamiento sea consistente es borrar el error y usar Response.TrySkipIisCustomErrors y establecerlo en verdadero. Esto anulará el manejo de la página de error global de IIS desde su página o el controlador de error global en Application_Error.

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

Normalmente, debe hacer esto en su controlador Application_Error que maneja todos los errores que los manejadores de errores de su aplicación no están captando.

Se puede encontrar información más detallada en esta publicación de blog: http://www.west-wind.com/weblog/posts/745738.aspx


78
2018-05-01 22:34



Establezca existingResponse to PassThrough en la sección system.webServer / httpErrors:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

El valor predeterminado de la propiedad existente Respuestas es Auto:

Auto le dice al módulo de error personalizado que haga derecho cosa. El texto de error real visto por los clientes se verá afectado según el valor de fTrySkipCustomErrors devuelto en IHttpResponse::GetStatus llamada. Cuando fTrySkipCustomErrors se establece en verdadero, el módulo de error personalizado permitirá que la respuesta pase, pero si se establece en falso, el módulo de errores personalizados reemplaza el texto con su propio texto.

Más información: Qué esperar del módulo de error personalizado de IIS7 


113
2018-03-31 20:07



Resuelto Resulta que los "Errores detallados" deben estar activados para que IIS7 pase a través de cualquier página de error que pueda tener. Ver http://forums.iis.net/t/1146653.aspx


11
2018-01-12 09:41



No estoy seguro de si esto es similar en naturaleza o no, pero resolví un problema que suena similar en la superficie y así es como lo manejé.

En primer lugar, el valor predeterminado para existingResponse (Auto) fue la respuesta correcta en mi caso, ya que tengo un 404, 400 y 500 personalizados (podría crear otros, pero estos tres serán suficientes para lo que estoy haciendo). Aquí están las secciones relevantes que me ayudaron.

Desde web.config:

<customErrors mode="Off" />

Y

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

A partir de ahí, agregué esto en Application_Error en global.asax:

    Response.TrySkipIisCustomErrors = True

En cada una de mis páginas de error personalizadas, tuve que incluir el código de estado de respuesta correcto. En mi caso, estoy usando un 404 personalizado para enviar usuarios a diferentes secciones de mi sitio, así que no lo hagasquiere un código de estado 404 devuelto a menos que realmente sea una página muerta.

De todos modos, así es como lo hice. Espero que ayude a alguien.


4
2017-07-31 12:44



Este problema ha sido un gran dolor de cabeza. Ninguna de las sugerencias mencionadas anteriormente por sí sola me solucionó, así que incluyo mi solución. Para el registro, nuestro entorno / plataforma utiliza:

  • .NET Framework 4
  • MVC 3
  • IIS8 (estación de trabajo) e IIS7 (servidor web)

Específicamente, estaba tratando de obtener una respuesta HTTP 404 que redirigiría al usuario a nuestra página 404 personalizada (a través de la configuración Web.config).

Primero, mi código tenía que lanzar un HttpException. Volviendo a NotFoundResult del controlador no logró los resultados que estaba buscando.

throw new HttpException(404, "There is no class with that subject");

Entonces tuve que configurar ambos el customErrors y httpError nodos en el Web.config.

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

Tenga en cuenta que me fui de la existingResponse como Auto, que es diferente de la solución @sefl proporcionada.

los customErrors configuraciones parecían ser necesarias para el manejo de mi lanzado explícitamente HttpException, mientras que la httpErrors el nodo manejó las URL que cayeron fuera de los patrones de ruta especificados en Globals.asax.cs.

PD Con estas configuraciones no necesitaba configurar Response.TrySkipIisCustomErrors


3
2018-02-26 19:34



De forma predeterminada, IIS 7 usa mensajes de error personalizados detallados, por lo que supongo que Response.StatusCode será igual a 404.XX en lugar de solo 404.

Puede configurar IIS7 para utilizar los códigos de mensaje de error más simples o modificar su código manejando los mensajes de error más detallados que IIS7 ofrece.

Más información disponible aquí: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx

Investigaciones posteriores revelaron que lo hice de forma incorrecta: los mensajes detallados no están predeterminados, pero quizás se han activado, en su cuadro si está viendo los diferentes mensajes de error que ha mencionado.


0
2018-01-12 02:53



TrySkipIisCustomErrors es solo una parte de un rompecabezas. Si usa páginas de error personalizadas pero también desea entregar contenido RESTful basado en estados 4xx, entonces tiene un problema. Establecer httpErrors.existingResponse de web.config en "Auto" no funciona, porque .net parece entregar siempre cierto contenido de la página a IIS, por lo que usar "Auto" hace que no se usen todas (o al menos algunas) páginas de error personalizadas. El uso de "Reemplazar" tampoco funcionará, ya que la respuesta contendrá su código de estado http, pero su contenido estará vacío o lleno con la página de error personalizado. Y el "PassThrough" de hecho desactiva el CEP, por lo que no se puede usar.

Por lo tanto, si desea omitir el CEP en algunos casos (evitando pasar al estado 4xx con algún contenido), necesitará un paso adicional: limpie el error:

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

Por lo tanto, si desea utilizar la respuesta REST (es decir, 400 - Solicitud incorrecta) y enviar contenido con ella, solo tendrá que configurar TrySkipIisCustomErrors en algún lugar de la acción y establecer existingResponse a "Auto" en la sección httpErrors en web.config. Ahora:

  • cuando no hay ningún error (la acción devuelve 4xx o 5xx) y se devuelve algo de contenido, el CEP no se utiliza y el contenido se pasa al cliente;
  • cuando hay un error (se lanza una excepción) se elimina el contenido devuelto por los manejadores de errores, por lo que se utiliza el CEP.

Si desea devolver el estado con contenido vacío de su acción, se tratará como una respuesta vacía y se mostrará CEP, por lo que hay espacio para mejorar este código.


0
2017-12-27 22:01