Elmah与asp.net站点不兼容。

80

我尝试在我的asp.net网站中使用elmah,但是每当我尝试访问http://localhost:port/elmah.axd时,我会得到一个资源未找到的异常。我的web.config如下所示。

    <?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>

编辑:Elmah = (错误日志记录模块和处理程序)
http://code.google.com/p/elmah/


1
Aman:你假设每个人都知道什么是ELMAH。我已经编辑了问题并提供了链接。如果不是这样,请纠正它。 - shahkalpesh
我猜你可能需要在IIS级别注册处理程序/模块,我猜这样才能使其正常工作。 - shahkalpesh
1
看看这个是否有帮助 - http://msdn.microsoft.com/zh-cn/library/aa479332.aspx - shahkalpesh
感谢@shahkalpesh。我真的被工作压得不知所措!虽然我认为这个问题可能也会帮助其他人,所以我把它变成了社区维基。 - TheVillageIdiot
很奇怪,我尝试了建议但没有运气!更糟糕的是,当我尝试访问 elmah.axd 时,IIS会挂起。 - user591509
7个回答

153

我在将Elmah部署到IIS7时遇到了类似的问题。我发现我需要在system.websystem.webServer中注册Elmah模块和处理程序:

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

出于某种原因,这使我在另一台服务器上成功使用了ELMAH。这很奇怪,因为它应该与我们的完全相同,但我们只有system.webserver声明。 - Maximillian
1
太棒了,这个答案帮我省了大量时间。 - Chris F
22
对于那些将内容从system.web剪切并粘贴到system.webserver的人,请确保在handlers部分中添加name属性。 - Jason Watts
谢谢,解决了我的问题!我已经为404定义了一个过滤器,但它仍然继续记录它们。 - Andrei Rînea
2
谢谢,这对我有用。但这是一个错误吗?根据https://dev59.com/X3RC5IYBdhLWcg3wROzk,`<system.web>应该用于IIS6,而<system.webServer>`应该用于IIS7+。 - DeepSpace101
@sid,我认为是NuGet包中的一个错误,但不是其他任何东西。 - Simon_Weaver

120

你可能也需要这个

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

当你遇到以下信息时:

403 - 禁止访问:拒绝访问。 您没有使用提供的凭据查看此目录或页面的权限。


1
在验证了eyesnz的帖子后,这对我很有用。 - CitizenBane
4
好的,但不要忘记通过身份验证来保护该页面。否则,任何人都可以阅读您的日志。 - driAn
好的,是的。404表示“未找到”,但通常当您将404标记为答案后,您通常会得到403。 - Jirapong
3
请在<sectiongroup name="elmah">下方添加 **<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>**。请注意,您需要保留原文的意思和格式,使翻译更加易于理解。 - Mhmd
你需要在 </configSections> 标签之后添加这个。 - Karl Glennon
你真是救命稻草啊,我总是忘记这个属性,哈哈。 - pqsk

28
尝试在<system.web>部分的“httphandlers”和“httpmodules”中注册模块和处理程序。
    <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>

太好了,它正在运行!!!我也想把它放在那里,但我没有在任何在线博客解决方案等中看到过,所以我有点害羞去做。 - TheVillageIdiot

12

在使用 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>

添加它解决了404错误问题。


这对我也绝对有效。谢谢Peter。 - Lee Englestone
这对我来说是解决方法,我也在使用vs 2013,iis8.0,并使用nuget进行安装。 - James Bailey
在使用NuGet安装ELMAH后,在本地调试中,这个方法解决了我在VS 2015中的问题。 - SenseiHitokiri
我也遇到了这个问题。我已经在项目 https://github.com/alexbeletsky/elmah-mvc/issues/89 上提交了一个问题。 - m.edmondson
也适用于我。 - Dragos Durlut

12

今天解决这个问题的一种方法是使用NuGet。

Visual Studio:菜单-> 工具-> 库程序包管理器-> 包管理器控制台

install-package elmah

希望能帮到你。


NuGet 真的让开发人员的生活更轻松了。 - TheVillageIdiot
我的web.config做得很好。 - Benj Sanders

9
Nuget包没有将以下重要行添加到web.config文件中,这导致了403错误。
<configuration>
  <elmah>  
    <security allowRemoteAccess="1" />
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/app_data/elmah" />
  </elmah>
</configuration>

您可能想要限制对错误日志的访问权限。
<add name="Elmah" verb="POST,GET,HEAD" path="/admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

0

如果您正在使用区域,请确保已更新其中一个 appsetting 键

默认

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

如果您是管理员区域

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接