Tengo un problema extraño aquí. Todo el mundo sabe que si usa la customErrors
sección de web.config para crear una página de error personalizada, debe configurarla Response.StatusCode
en lo que sea apropiado. Por ejemplo, si hago una página 404 personalizada y la nombro 404.aspx, podría poner <% Response.StatusCode = 404 %>
el contenido para que tenga un verdadero encabezado de estado 404.
¿Me sigues tan lejos? Bueno. Ahora intente hacer esto en IIS7. No puedo hacer que funcione, punto. Si Response.StatusCode
se establece en la página de error personalizada, IIS7 parece anular la página de error personalizada por completo 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 solucionarlo? Funcionaba bajo IIS6, así que no sé por qué cambiaron las cosas.
Nota: Esto no es lo mismo que el problema en ASP.NET Custom 404 Devuelve 200 OK en lugar de 404 Not Found
Respuestas:
Establezca existingResponse en PassThrough en la sección system.webServer / httpErrors:
El valor predeterminado de la propiedad existingResponse es Auto:
Más información: Qué esperar del módulo de error personalizado IIS7
fuente
<httpErrors existingResponse="PassThrough" />
equivalenteResponse.TrySkipIisCustomErrors
o se comportan de manera diferente?Response.TrySkipIisCustomErrors
usted obtienen un mejor control sobre cuándo mostrar los errores personalizados de IIS.La forma más sencilla de hacer que el comportamiento sea coherente es borrar el error y usar Response.TrySkipIisCustomErrors y establecerlo en true. Esto anulará el manejo de la página de error global de IIS desde dentro de su página o el controlador de error global en Application_Error.
Por lo general, debe hacer esto en su controlador Application_Error que maneja todos los errores que los controladores de errores de su aplicación no detectan.
Puede encontrar información más detallada en esta publicación de blog: http://www.west-wind.com/weblog/posts/745738.aspx
fuente
customError
configurado en Web.config para gatillo. ConResponse.TrySkipIisCustomErrors = true
obtengo el mismo comportamiento: se muestra la fea página de error generada por el servidor. Con él configurado en,false
no sucede nada: una ventana del navegador en blanco.Server:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
customErrors mode="Off"
para que esto funcione. Si hago eso, entonces httpErrors existingResponse = "Auto" (predeterminado) funciona correctamente para mí cuando uso el código en esta respuesta.Resuelto: Resulta que "Errores detallados" debe estar activado para que IIS7 "pase a través" de cualquier página de error que pueda tener. Ver http://forums.iis.net/t/1146653.aspx
fuente
No estoy seguro de si esto es de naturaleza similar 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 personalizado (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:
Y
A partir de ahí, agregué esto a Application_Error en global.asax:
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, por lo que no quiero que se devuelva un código de estado 404 a menos que en realidad sea una página muerta.
De todos modos, así es como lo hice. Espero que ayude a alguien.
fuente
Este problema ha sido un gran dolor de cabeza. Ninguna de las sugerencias mencionadas anteriormente me resolvió por sí sola, así que incluyo mi solución. Para el registro, nuestro entorno / plataforma utiliza:
Específicamente, estaba tratando de obtener una respuesta HTTP 404 que redirigiera al usuario a nuestra página personalizada 404 (a través de la configuración de Web.config).
Primero, mi código tenía que lanzar un
HttpException
. Devolver unNotFoundResult
del controlador no logró los resultados que buscaba.Luego tuve que configurar tanto el
customErrors
yhttpError
nodos en el Web.config....
Tenga en cuenta que dejé el
existingResponse
asAuto
, que es diferente a la solución que proporcionó @sefl.La
customErrors
configuración parecía ser necesaria para manejar mi lanzamiento explícitoHttpException
, mientras que elhttpErrors
nodo manejaba las URL que quedaban fuera de los patrones de ruta especificados en Globals.asax.cs.PD: Con esta configuración no necesitaba configurar
Response.TrySkipIisCustomErrors
fuente
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. Configurar httpErrors.existingResponse de web.config en "Auto" no funciona, porque .net parece entregar siempre parte del contenido de la página a IIS, por lo tanto, usar "Auto" hace que no se utilicen todas (o al menos algunas) las páginas de error personalizadas. El uso de "Reemplazar" tampoco funcionará, porque la respuesta contendrá su código de estado http, pero su contenido estará vacío o lleno de una página de error personalizada. Y el "PassThrough" de hecho apaga el CEP, por lo que no se puede usar.Entonces, si desea omitir CEP en algunos casos (al omitir me refiero a devolver el estado 4xx con algún contenido), necesitará un paso adicional: limpiar el error:
Entonces, si desea usar la respuesta REST (es decir, 400 - Solicitud incorrecta) y enviar algo de contenido con ella, solo tendrá que establecer
TrySkipIisCustomErrors
en algún lugar en acción y establecerexistingResponse
en "Auto" en la sección httpErrors en web.config. Ahora: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.
fuente
De forma predeterminada, IIS 7 utiliza 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 usar los códigos de mensaje de error más simples o modificar su código manejando los mensajes de error más detallados que ofrece IIS7.
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 tenía al revés: los mensajes detallados no son predeterminados, pero tal vez se hayan activado en su caja si está viendo los diferentes mensajes de error que ha mencionado.
fuente