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/


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


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>

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>

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ó.


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.


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


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" />

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" />
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.