2010-04-13 11 views
13

Tengo una aplicación ASP.NET MVC 2, que tiene un controlador de eventos Application_Error en global.asax. En esto, estoy detectando el caso donde el tipo de Excepción es HttpException y el código HTTP es 404, y el redireccionamiento a mi propia página de manejo de 404.¿Cómo evito que IIS7 entregue su propio 404 antes de que mi aplicación MVC tenga la oportunidad de manejarlo?

Esto funciona bien en mi servidor de desarrollo Cassini, pero ahora estoy tratando de moverlo a mi servidor de producción que tiene IIS7 (usando el modo integrado).

Cuando solicito una URL inexistente, IIS7 muestra su propia página 404, y hasta donde puedo decir, mi método Application_Error nunca se llama.

¿Cómo puedo solucionar eso?

+0

Borrar el error usando 'Server.ClearError()' antes intentando redirigir. – devstuff

+0

Similar [question] (http://stackoverflow.com/questions/1171035/asp-net-mvc-custom-error-handling-application-error-global-asax) – nubm

+0

Similar, pero el código de OP y el código en el la respuesta aceptada es bastante cercana a lo que tengo. Que funciona en Cassini (y posiblemente IIS en modo clásico), pero parece que no funciona, al menos para mí, en el modo integrado de IIS7. –

Respuesta

6

me contestaron que en otro post: ASP.NET Application hosted on IIS7 that is ignoring custom errors and falls back to IIS errors

"para desactivar los mensajes de error de IIS que tiene que establecer

Response.TrySkipIisCustomErrors = true; 

en su página de error después de eso,. sus mensajes de error deberían mostrarse sin problema ".

+0

No lo he intentado, dado que ya no trabajo con este sitio web, pero parece convincente y parece funcionar para otros, así que ... aceptado. –

+0

Por alguna razón, este enfoque no funciona con el código de estado 404.15. IIS maneja este tipo de errores por sí mismo a pesar de establecer Response.TrySkipIisCustomErrors = true. – Sergey

0

En ASP.NET MVC utilizo un ErrorController personalizado con un método de Índice (controlador predeterminado) y algunos controladores personalizados (401, 404) utilizando la siguiente web.config settings

<!-- CUSTOM ERROR MESSAGES 
Set customErrors mode="On" or "RemoteOnly" to enable custom error messages, "Off" to disable. 
Add <error> tags for each of the errors you want to handle. 
"On" Always display custom (friendly) messages. 
"Off" Always display detailed ASP.NET error information. 
"RemoteOnly" Display custom (friendly) messages only to users not running 
on the local Web server. This setting is recommended for security purposes, so 
that you do not display application detail information to remote clients. --> 
<customErrors mode="Off" defaultRedirect="~/Error"> 
    <error statusCode="401" redirect="~/Error/Unauthorized" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
</customErrors> 

no lo hago use Application_Error excepto para fines de registro.

+1

@Todd: dado que tengo toda mi lógica de manejo de errores escrita y trabajando localmente, realmente no quiero tener que cambiar a otro método. Espero que alguien pueda decirme el hechizo mágico para alejar a los espíritus malignos de IIS7. Además, yo también uso Application_Error para hacer un poco de registro, y como mencioné en mi pregunta, en realidad no está llegando, presumiblemente por el mismo problema, así que no obtengo ningún registro :-( –

+0

@Todd: también leo en algún lugar que el bloque customErrors * no * se usa en el modo integrado de IIS7. –

4

no puedes apagar el httpError 404:

<httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
    </httpErrors> 
0

Esto se discute en los tutoriales visión general de MVC. Es probable que su IIS 7 esté configurado en modo Clásico. Ver:

Using ASP.NET MVC with Different Versions of IIS (C#)

+0

Dije específicamente en la pregunta que estoy usando el modo integrado. Incluso lo puse en negrita. :-) –

+0

Mis aplicaciones, me lo perdí. Debe ser mi edad. En ese caso, debe establecer HttpResponse StatusCode en un valor que no sea de error. De esta forma, IIS no interceptará su redirección.La página de Error debería devolver 404 no el redireccionamiento a la misma. –

0

La respuesta por Flynn resuelto mi problema de ASP.NET toma de control del 404

Ahora soy capaz de hacer esto:

Response.TrySkipIisCustomErrors = true; 
Response.StatusCode = 404; 
Response.Write("<script type='text/javascript'>setTimeout(function() { window.location = '/'; }, 1000)</script>"); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
Cuestiones relacionadas