2011-05-06 12 views
7
integrado

Tengo problemas con un controlador de errores personalizado que construí. Debería ser un HttpModule, pero cuando lo agrego a la etiqueta web.config de system.webServer/modules, no se inicia.HttpModule personalizado para IIS 7 para

Ésta es mi web.config sección:

<system.webServer> 
    <modules> 
    <add name="AspExceptionHandler" 
     type="Company.Exceptions.AspExceptionHandler, Company.Exceptions" 
     preCondition="managedHandler" /> 
    </modules> 
</system.webServer> 

Este es el código en mi HttpModule:

using System; 
using System.Web; 
using Company.Settings; 
using System.Configuration; 

namespace Company.Exceptions 
{ 
    public class AspExceptionHandler : IHttpModule 
    { 
    public void Dispose() { } 

    public void Init(HttpApplication application) 
    { 
     application.Error += new EventHandler(ErrorHandler); 
    } 

    private void ErrorHandler(object sender, EventArgs e) 
    { 
     HttpApplication application = (HttpApplication)sender; 
     HttpContext currentContext = application.Context; 

     // Gather information5 
     Exception currentException = application.Server.GetLastError(); 
     String errorPage = "http://www.mycompaniesmainsite.com/error.html"; 

     HttpException httpException = currentException as HttpException; 
     if (httpException == null || httpException.GetHttpCode() != 404) 
     {   
     currentContext.Server.Transfer(errorPage, true); 
     } 
     else 
     { 
     application.Response.Status = "404 Not Found"; 
     application.Response.StatusCode = 404; 
     application.Response.StatusDescription = "Not Found"; 
     currentContext.Server.Transfer(errorPage, true); 
     } 
    } 
    } 
} 

Podría alguien por favor me explique lo que estoy haciendo mal, y cómo IIS Managed 7 Integrado ¿El modo de tubería funciona? Debido a que la mayoría de las respuestas que encontré se refieren a la configuración de HttpModules para IIS 6.

Respuesta

3

Por lo que veo, está en el camino correcto. ¿Se ha asegurado de que el grupo de aplicaciones de su sitio esté configurado en el modo de canal gestionado?

Además, si está probando esto con el servidor web incorporado de Visual Studio (Cassini), se ignorará la sección <system.webServer>. Necesitará IIS7 o IIS7.5 Express si desea que el módulo se cargue desde allí.

+0

Gracias por la respuesta rápida, que ha configurado el grupo de aplicaciones a modo de canalización administrada. Lo probé usando IIS express en mi máquina local, y cuando eso no funcionó, publiqué el sitio en un servidor con IIS 7. Allí pude ver que el módulo estaba cargado, pero nunca se dispara. Así que estoy gessing es algo más que estoy haciendo mal ... –

+0

Un error de sintaxis en mi web.config y algo de limpieza/solución de compilación y publica después, parece que funciona ... –

+0

@jonas - nice one :) – Kev

0

Estaba teniendo el mismo problema que un controlador que no se activa, al hacer los siguientes cambios en el código anterior me ayudó a resolver este problema. En lugar de crear un nuevo controlador de eventos, simplemente adjunté el método con la misma firma a ese evento.

application.Error += ErrorHandler; 

Esto funciona para mí, sigue analizando cuál es la razón detrás de esta manera la fijación de un manejador trabaja en IIS7.

0

Tuve este problema y descubrí que no apagar los CustomErrors evitaba que el controlador se disparara.

es decir: esto es requerido en su configuración para el evento de error a ser capturado en el HttpModule:

<system.web> 
    <customErrors mode="Off" /> 
</system.web> 
Cuestiones relacionadas