Elmah nie działa z witryną asp.net


80

Próbowałem użyć elmah z moją witryną asp.net, ale za każdym razem, gdy próbuję przejść do http: // localhost: port / elmah.axd , otrzymuję wyjątek nie znaleziono zasobu. Mój web.config znajduje się poniżej.

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

EDYCJA: Elmah = (moduły rejestrowania błędów i programy obsługi)
http://code.google.com/p/elmah/


1
Aman: Zakładasz, że wszyscy wiedzą, czym jest ELMAH. Edytowałem pytanie, aby podać link. Popraw to, jeśli tak nie jest.
— shahkalpesh

Myślę, że może być konieczne zarejestrowanie programu obsługi / modułu na poziomie IIS, myślę, że to zadziała.
— shahkalpesh


Dzięki @shahkalpesh. Jestem naprawdę przytłoczony pracą! Chociaż pomyślałem, że to pytanie może pomóc również innym i stworzyłem wiki społeczności.
— TheVillageIdiot

Dziwne, ale wypróbowałem sugestie bez powodzenia! Najgorsze, kiedy próbowałem uzyskać dostęp elmah.axd, IIS zawiesza się.

Odpowiedzi:


28

Spróbuj zarejestrować moduły i programy obsługi w sekcjach „httphandlers” i „httpmodules” w <system.web>sekcji:

    <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 to działa !!! Przyszło mi do głowy, żeby to tam umieścić, ale nie widziałem tego w żadnych rozwiązaniach dla blogów internetowych itp., Więc byłem trochę nieśmiały, aby to zrobić.
— TheVillageIdiot

153

Właśnie miałem podobny problem z Elmah, który nie działał we wdrożeniu IIS7. Zauważyłem, że muszę zarejestrować moduły i handlery Elmah w system.webAND 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>

Z jakiegoś powodu ELMAH pracował dla mnie na innym serwerze. Co jest dziwne, ponieważ powinno być identyczne z naszym, ale mamy tylko deklaracje system.webserver.
— Maximillian

2
Dzięki, to naprawdę mi pomogło.
— stimms

1
Niesamowite, ta odpowiedź zaoszczędziła mi dużo czasu.
— Chris F

22
dla tych z Was, którzy wycinają i wklejają z system.web do system.webserver, upewnijcie się, że dodaliście atrybut name w sekcji obsługi.
— Jason Watts

2
Dzięki, u mnie zadziałało. Ale czy to błąd? <system.web>ma być dla IIS6, podczas gdy <system.webServer>jest dla IIS7 + na stackoverflow.com/questions/355261/ ...
— DeepSpace101

120

Możesz też potrzebować tego

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

kiedy dostaniesz

403 - Dostęp zabroniony: odmowa dostępu. Nie masz uprawnień do przeglądania tego katalogu lub strony przy użyciu podanych poświadczeń.


1
Zrobiło to dla mnie po zweryfikowaniu posta eyesnz.
— CitizenBane

4
Tak, ale nie zapomnij zabezpieczyć tej strony poprzez uwierzytelnienie. W przeciwnym razie każdy może czytać Twoje logi.
— driAn

No tak. 404 to „nie znaleziono”, ale najczęściej, gdy
— poprawisz

3
musisz dodać w sekcji sectiongroup name = "elmah" <section name = "security" requirePermission = "false" type = "Elmah.SecuritySectionHandler, Elmah" />
— Mhmd

Musisz to dodać po tagu </configSections>
— Karl Glennon

12

Brakowało tego wiersza, gdy instalowałem przy użyciu 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>

Dodanie go rozwiązało problem błędu 404.


Dla mnie to też absolutnie zadziałało. Dzięki Peter.
— Lee Englestone,

To była dla mnie poprawka, jestem również na vs 2013, iis8.0, użyłem nuget do zainstalowania.
— James Bailey

To naprawiło to dla mnie w VS 2015 na localhost w debugowaniu po użyciu nuget do zainstalowania ELMAH.
— SenseiHitokiri

Ja też to miałem. Podniosłem problem z projektem github.com/alexbeletsky/elmah-mvc/issues/89
— m.edmondson

U mnie też
— zadziałał

11

Jednym ze sposobów obejścia tego dzisiaj jest użycie nuget.

Visual studio: menu-> narzędzia-> menedżer pakietów bibliotek-> konsola menedżera pakietów

install-package elmah

HTH


nuget naprawdę ułatwia życie programistom.
— TheVillageIdiot

Świetnie na moim web.config
— Benj Sanders

9

Pakiet NuGet nie dodaje następujących ważnych wierszy do pliku web.config, powodując błąd 403.

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

Możesz również ograniczyć dostęp do dzienników błędów przez

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

0

jeśli używasz obszarów, upewnij się, że zaktualizowałeś jeden z kluczy appSetting

Domyślna

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

Jeśli jesteś obszarem jako Admin

<add key="elmah.mvc.route" value="admin/elmah" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.