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/

TheVillageIdiot
źródło
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
1
Sprawdź, czy to pomoże - msdn.microsoft.com/en-us/library/aa479332.aspx
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>
Dan
źródło
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>
eyesnz
źródło
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ń.

Jirapong
źródło
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.

Peter Gluck
źródło
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

LosManos
źródło
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" />
Prafulla
źródło
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" />
akd
źródło