Elmah no funciona con el sitio asp.net

80

Intenté usar elmah con mi sitio asp.net, pero cada vez que intento ir a http: // localhost: port / elmah.axd obtengo la excepción de recurso no encontrado. Mi web.config se muestra a continuación.

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <sectionGroup name="elmah">
          <section name="security" requirePermission="false" 
                  type="Elmah.SecuritySectionHandler, Elmah"/>
          <section name="errorLog" requirePermission="false" 
                  type="Elmah.ErrorLogSectionHandler, Elmah" />
          <section name="errorMail" requirePermission="false" 
                  type="Elmah.ErrorMailSectionHandler, Elmah" />
          <section name="errorFilter" requirePermission="false" 
                  type="Elmah.ErrorFilterSectionHandler, Elmah"/>
        </sectionGroup>
      </configSections>
      <elmah>
        <security allowRemoteAccess="0" />
        <errorLog type="Elmah.SqlErrorLog, Elmah" 
                 connectionStringName="elmah-sql" />
        <errorMail
                from="my@account"
                to="myself"
                subject="ERROR From Elmah:"
                async="true"
                smtpPort="587"
                smtpServer="smtp.gmail.com"
                userName="my@account"
                password="mypassword" />
      </elmah>

      <connectionStrings>
        <add name="elmah-sql" connectionString="data source=(sqlserver); 
               database=elmahdb;
             integrated security=false;User ID=user;Password=password"/>
      </connectionStrings>
      <system.web>
        <compilation debug="true">
          <assemblies>
            <add assembly="Elmah, Version=1.0.10617.0, Culture=neutral, 
               PublicKeyToken=null"/>
          </assemblies>
        </compilation>
        <authentication mode="Windows"/>

        <httpHandlers>
          <remove verb="*" path="*.asmx"/>
          <add verb="*" path="*.asmx" validate="false" 
            type="System.Web.Script.Services.ScriptHandlerFactory, 
               System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
                  PublicKeyToken=31BF3856AD364E35"/>
          <add verb="*" path="*_AppService.axd" validate="false" 
               type="System.Web.Script.Services.ScriptHandlerFactory, 
               System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35"/>
          <add verb="GET,HEAD" path="ScriptResource.axd" 
                 type="System.Web.Handlers.ScriptResourceHandler, 
               System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
                    PublicKeyToken=31BF3856AD364E35" validate="false"/>
        </httpHandlers>
        <httpModules>
          <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, 
                System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
                PublicKeyToken=31BF3856AD364E35"/>
        </httpModules>
      </system.web>

      <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules runAllManagedModulesForAllRequests="true">
          <remove name="ScriptModule"/>
          <add name="ScriptModule" preCondition="managedHandler" 
                type="System.Web.Handlers.ScriptModule, 
               System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
                 PublicKeyToken=31BF3856AD364E35"/>
          <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
          <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
          <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
        </modules>

        <handlers>
          <remove name="WebServiceHandlerFactory-Integrated"/>
          <remove name="ScriptHandlerFactory"/>
          <remove name="ScriptHandlerFactoryAppServices"/>
          <remove name="ScriptResource"/>
          <add name="ScriptHandlerFactory" verb="*" path="*.asmx" 
                preCondition="integratedMode" 
               type="System.Web.Script.Services.ScriptHandlerFactory, 
                    System.Web.Extensions, Version=3.5.0.0, 
               Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add name="ScriptHandlerFactoryAppServices" verb="*" 
            path="*_AppService.axd" preCondition="integratedMode" 
               type="System.Web.Script.Services.ScriptHandlerFactory, 
                 System.Web.Extensions, Version=3.5.0.0, 
               Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add name="ScriptResource" preCondition="integratedMode" 
            verb="GET,HEAD" path="ScriptResource.axd" 
               type="System.Web.Handlers.ScriptResourceHandler, 
            System.Web.Extensions, Version=3.5.0.0, 
               Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" 
                       preCondition="integratedMode" 
               type="Elmah.ErrorLogPageFactory, Elmah"/>
        </handlers>
      </system.webServer>
    </configuration>

EDITAR: Elmah = (Módulos y controladores de registro de errores)
http://code.google.com/p/elmah/

TheVillageIdiot
fuente
1
Aman: Está asumiendo que todos saben qué es ELMAH. He editado la pregunta para proporcionar el enlace. Corríjalo, si no es el caso.
shahkalpesh
Supongo que es posible que deba registrar el controlador / módulo en el nivel de IIS, supongo que para que funcione.
shahkalpesh
1
Vea si esto ayuda - msdn.microsoft.com/en-us/library/aa479332.aspx
shahkalpesh
Gracias @shahkalpesh. ¡Estoy realmente abrumado por el trabajo! Aunque pensé que esta pregunta también podría ayudar a otros y la hice wiki comunitaria.
TheVillageIdiot
¡Extraño, pero probé las sugerencias sin suerte! Lo peor es que cuando intenté acceder elmah.axd, el IIS se cuelga.

Respuestas:

28

Intente registrar los módulos y controladores en las secciones "httphandlers" y "httpmodules" en la <system.web>sección:

    <httpHandlers>
      ......
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
      .....

    </httpHandlers>
    <httpModules>
        .......
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
       .......
    </httpModules>
Dan
fuente
Yippe está funcionando !!! También se me ocurrió ponerlo allí, pero no lo he visto en ninguna solución de blogs en línea, etc., así que fui un poco tímido para hacerlo.
TheVillageIdiot
153

Acabo de tener un problema similar con Elmah que no funciona en una implementación de IIS7. Descubrí que necesitaba registrar los módulos y controladores de Elmah en system.webY system.webServer:

<system.web>
...
  <httpHandlers>
    ...
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    ...
  </httpHandlers>
  <httpModules>
    ...
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    ...
  </httpModules>
  ...
</system.web>
<system.webServer>
  ...
  <modules runAllManagedModulesForAllRequests="true">
    ...
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    ...
  </modules>
  <handlers>
    ...
    <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    ...
  </handlers>
<system.webServer>
eyesnz
fuente
Por alguna razón, esto hizo que ELMAH trabajara para mí en un servidor diferente. Lo cual es extraño, ya que debería ser idéntico al nuestro, pero solo tenemos declaraciones system.webserver.
Maximillian
2
Gracias, eso realmente me ayudó.
Estimulación
1
Increíble, esta respuesta me salvó mucho.
Chris F
22
para aquellos de ustedes que cortan y pegan de system.web a system.webserver, asegúrese de agregar el atributo de nombre en la sección de controladores.
Jason Watts
2
Gracias, funcionó para mí. ¿Pero es esto un error? <system.web>se supone que es para IIS6 mientras que <system.webServer>es para IIS7 + según stackoverflow.com/questions/355261/…
DeepSpace101
120

Puede que también necesites este

<elmah>
    <security allowRemoteAccess="1" />
</elmah> 

Cuando tengas

403 - Prohibido: acceso denegado. No tiene permiso para ver este directorio o página con las credenciales que proporcionó.

Jirapong
fuente
1
Esto lo hizo por mí después de verificar la publicación de eyesnz.
CitizenBane
4
Sí, pero no olvide proteger esa página mediante autenticación. De lo contrario, cualquiera puede leer sus registros.
driAn
bueno, sí. 404 es "no encontrado", pero sobre todo cuando corrige 404 como respuesta marcada, normalmente obtiene 403.
Jirapong
3
debe agregar en sectiongroup name = "elmah" <section name = "security" requirePermission = "false" type = "Elmah.SecuritySectionHandler, Elmah" />
Mhmd
Debe agregar esto después de la etiqueta </configSections>
Karl Glennon
12

Faltaba esta línea cuando instalé usando NuGet (VS 2013, IIS 8.0):

<system.webServer>
  <handlers>
    <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
 </handlers>
</system.webServer>

Agregarlo resolvió el problema del error 404.

Peter Gluck
fuente
Esto absolutamente funcionó para mí también. Gracias Peter.
Lee Englestone
Esta fue la solución para mí, también estoy en vs 2013, iis8.0, usé nuget para instalar.
James Bailey
Esto me lo solucionó en VS 2015 en localhost en depuración después de usar nuget para instalar ELMAH.
SenseiHitokiri
Yo también tenía esto. He planteado un problema con el proyecto github.com/alexbeletsky/elmah-mvc/issues/89
m.edmondson
También funcionó para mí
Dragos Durlut
11

Una forma de evitarlo hoy es usar nuget.

Visual studio: menú-> herramientas-> administrador de paquetes de la biblioteca-> consola del administrador de paquetes

install-package elmah

HTH

LosManos
fuente
nuget realmente facilita la vida de los desarrolladores.
TheVillageIdiot
Lo hice bien en mi web.config
Benj Sanders
9

El paquete nuget no agrega las siguientes líneas importantes a web.config, lo que genera un error 403.

<configuration>
  <elmah>  
    <security allowRemoteAccess="1" />
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/app_data/elmah" />
  </elmah>
</configuration>

También es posible que desee restringir el acceso a los registros de errores mediante

<add name="Elmah" verb="POST,GET,HEAD" path="/admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />
Prafulla
fuente
0

Si está utilizando Áreas, asegúrese de haber actualizado una de las claves de configuración de la aplicación.

Defecto

<add key="elmah.mvc.route" value="elmah" />

Si eres un área como Admin

<add key="elmah.mvc.route" value="admin/elmah" />
akd
fuente