2012-04-07 22 views
5

No puedo configurar IIS para que sirva mis páginas de error personalizadas para errores fuera de la interconexión de MVC. Si lanzo una excepción dentro de un controlador que todo archivo, el evento Application_Error se encarga de que:Habilitar los errores personalizados en Azure

protected void Application_Error(object sender, EventArgs e) 
    { 
     var error = Server.GetLastError(); 

     var routeData = new RouteData(); 
     routeData.Values["Controller"] = "Error"; 
     routeData.Values["Area"] = ""; 
     routeData.Values["Exception"] = error; 

     if (error is HttpException) 
     { 
      switch (((HttpException)error).GetHttpCode()) 
      { 
       case 401: 
        routeData.Values["Action"] = "NotAllowed"; 
        break; 

       case 403: 
        routeData.Values["Action"] = "NotAllowed"; 
        break; 

       case 404: 
        routeData.Values["Action"] = "NotFound"; 
        break; 
       default: 
        routeData.Values["Action"] = "ServerError"; 
        break; 
      } 
     } 
     else 
     { 
      routeData.Values["Action"] = "ServerError"; 
     } 

     Response.Clear(); 
     Server.ClearError(); 

     IController controller = new ErrorController(); 
     controller.Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData)); 
    } 

Sin embargo, si navego a una URL inexistente, IIS manejar el error 404 (o cualquier otro error), me da el mensaje de error de IIS estándar y ignorando completamente mi configuración web.config:

<system.web> 
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/error"> 
    <error statusCode="401" redirect="/error/notallowed" /> 
    <error statusCode="403" redirect="/error/notallowed" /> 
    <error statusCode="404" redirect="/error/notfound" /> 
    <error statusCode="500" redirect="/error/servererror" /> 
    </customErrors> 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL"> 
    <clear /> 
    <error statusCode="401" path="/error/notallowed" /> 
    <error statusCode="403" path="/error/notallowed" /> 
    <error statusCode="404" path="/error/notfound" /> 
    <error statusCode="500" path="/error/servererror" /> 
    </httpErrors> 
</system.webServer> 

IIS default error page

/error/* es manejado por un controlador dentro de mi solicitud. ¿Qué puedo hacer para que IIS ejecute la ruta de error personalizada, en lugar de enviarme la página de error estándar?

Esto es ASP.NET MVC 3, ejecutándose en Azure. Tampoco funciona bajo IIS directo, pero el servidor de desarrollo ejecuta el controlador.

Respuesta

9

IIS no respeta defaultResponseMode. Debe añadir responseMode a todos y cada uno de error, así:

<httpErrors errorMode="Custom"> 
    <clear /> 
    <error statusCode="401" path="/error/notallowed" responseMode="ExecuteURL" /> 
    <error statusCode="403" path="/error/notallowed" responseMode="ExecuteURL" /> 
    <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" /> 
    <error statusCode="500" path="/error/servererror" responseMode="ExecuteURL" /> 
</httpErrors> 

¿Por qué no se aplica por defecto está más allá de mí.

+0

Esto es definitivamente extraño. Me ayudó, sin embargo. – xdumaine

+0

Lo mismo aplica para CustomErrors, es decir no coincidirá con nada. Necesita definir explícitamente cada error como se indicó anteriormente: Kildareflare

0

Asegúrese de haber establecido esta configuración.

<system.webServer> 

    <modules runAllManagedModulesForAllRequests="true"/> 

</system.webServer> 

De lo contrario su aplicación IIS también puedan estar en funcionamiento en el modo clásico en lugar de modo integrado, que es una configuración de IIS, sin embargo el modo pensé integrado fue el defecto en Azure (pero para ser honesto no lo he comprobado)

+0

Esa configuración está presente. La aplicación se ejecuta en modo integrado. – CMircea

3

Encontré muchas soluciones a través de la web, pero tampoco funcionaba para archivos estáticos (por ejemplo, para 'picture.jpg' no existente).

Esta solución funciona para mí tanto en Azure WebSites como en la instancia de Azure WebRole. Utilizo las transformaciones web.config, así que actualícelas según sus propias necesidades.

utilizo páginas ASPX de errores para poder establecer código de respuesta HTTP correcto (IIS siempre establece HTTP 200, cuando solía páginas .htm)

Archivo ~/404.aspx es:

<%@ Page Language="C#" AutoEventWireup="false" ContentType="text/html" Debug="false" EnableEventValidation="false" EnableSessionState="False" EnableViewState="false" ResponseEncoding="utf-8" Transaction="Disabled" ValidateRequest="false" ViewStateMode="Disabled" %> 
<% Context.Response.StatusCode = 404; %> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>404 Error - Page not found</title> 
</head> 
<body> 
    <h1>Custom 404 page</h1> 
</body> 
</html> 

archivo es ~/500.aspx :

<%@ Page Language="C#" AutoEventWireup="false" ContentType="text/html" Debug="false" EnableEventValidation="false" EnableSessionState="False" EnableViewState="false" ResponseEncoding="utf-8" Transaction="Disabled" ValidateRequest="false" ViewStateMode="Disabled" %> 
<% Context.Response.StatusCode = 500; %> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>500 Server Error</title> 
</head> 
<body> 
    <h1>Custom 500 page</h1> 
</body> 
</html> 

partes neccessary de ~/Web.config contiene:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <customErrors mode="Off" /> 
    </system.web> 

    <system.webServer> 
    <httpErrors errorMode="Detailed" /> 
    </system.webServer> 
</configuration> 

partes neccessary de ~/Web.Release.config contiene:

<?xml version="1.0"?> 
<configuration> 
    <customErrors mode="On" defaultRedirect="/500.aspx" redirectMode="ResponseRewrite" xdt:Transform="Replace"> 
    <!-- AWARE do NOT use address in form "~/404.htm" but in "/404.htm" --> 
    <error statusCode="404" redirect="/404.aspx" /> 
    <error statusCode="500" redirect="/500.aspx"/> 
    </customErrors> 

    <system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace" xdt:Transform="Replace"> 
     <!-- AWARE do NOT use address in form "~/404.htm" but in "/404.htm" --> 
     <remove statusCode="404" /> 
     <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" /> 

     <remove statusCode="500" /> 
     <error statusCode="500" path="/500.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
    </system.webServer> 
</configuration> 

El extremo.

3

que tenían exactamente este problema y yo estaba en Azure, la siguiente resuelto por mí:

Response.TrySkipIisCustomErrors = true; 
+0

¡Gracias! ¡Salvó mi vida! :RE – apostolov

Cuestiones relacionadas