Проблема с Эльмах в GAC

Я пытаюсь следовать этой статье: http://www.codeproject.com/KB/aspnet/elmahGAC.aspx

чтобы заставить Elmah работать из GAC, а не настраивать для каждого приложения индивидуально. Все работает локально, но когда настройки выставлены глобально, Elmah перестает вести логи. Я где-то читал, что если Elmah запускается из GAC, тогда настройки должны быть в «global» machine.config по сравнению с «global» web.config, но я пробовал оба. Прямо сейчас я нахожусь в точке, где, если я добавлю это:

<system.webServer>
<modules>
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=abc123" preCondition="managedHandler" />
</modules>
</system.webServer>

в мое приложение web.config, он берет остальные настройки из глобального machine.config и успешно регистрирует. Чтобы ответить на очевидный вопрос, да, у меня есть этот раздел в global machine.config, и я даже пытался ввести его в глобальный web.config, но регистрация по-прежнему не работает. У кого-нибудь есть идеи? Есть ли способ заставить Elmah отображать свои ошибки вместо того, чтобы тихо терпеть неудачу?

РЕДАКТИРОВАТЬ: Вот мой "глобальный" файл machine.config. Это просто значение по умолчанию с добавленным материалом для ELMAH и удалением некоторых групп разделов для соответствия ограничению символов. Я, наверное, также должен отметить, что это работает в IIS7.

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>


<configSections>
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
    </sectionGroup>
  </configSections>

<connectionStrings>
<clear />
<add name="Elmah.Sql"      connectionString="IMNOTTELLING" providerName="System.Data.SqlClient" />
<add name="LocalSqlServer" connectionString="IMNOTTELLING" providerName="System.Data.SqlClient" />
</connectionStrings>

<elmah>
  <security allowRemoteAccess="0" />
  <errorLog type="Elmah.SqlErrorLog, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" connectionStringName="Elmah.Sql" />      
</elmah>

<runtime />



<system.data>
    <DbProviderFactories />
</system.data>

<system.serviceModel>
Nothing tampered with here
</system.serviceModel>



<system.web>
    <processModel autoConfig="true"/>

  <httpHandlers>
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
  </httpHandlers>

  <httpModules>
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
  </httpModules>

  <compilation>
    <assemblies>
      <add assembly="Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" />
    </assemblies>
  </compilation>

    <membership>
    Nothing tampered with here
    </membership>

    <profile>
        <providers>
            <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </profile>

    <roleManager>
        Nothing tampered with here
    </roleManager>
</system.web>


<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests ="true">
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" preCondition="managedHandler" />
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" preCondition="managedHandler" />
  <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" preCondition="managedHandler" />
</modules>
<handlers>
  <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah, Version=1.2.13605.0, Culture=neutral, PublicKeyToken=e50dbdd41da277ac" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>

РЕДАКТИРОВАТЬ: Я установил модули и обработчик непосредственно в IIS, и теперь он работает.


person Bruce Llewellyn    schedule 16.08.2011    source источник


Ответы (4)


У меня также были проблемы с IIS7 при установке Win7x64 (тестирование для производственной системы). Я наконец добился этого, поместив модуль и обработчик в соответствующие узлы в файле applicationHost.config.

C:\Windows\System32\inetsrv\config\applicationHost.config

Похоже, что IIS7 игнорирует определенные области web.config файлов основной платформы, вместо этого используя applicationHost.config файл для настроек IIS.

Обратите внимание на этот файл, если вы используете 64-битную установку: кажется, что 32-битные приложения (включая Visual Studio) не видят этот файл. Это из-за некоторого поведения файловой системы из-за того, что ОС 64-битная. Один простой способ - открыть его, используя путь UNC:

\\localhost\c$\Windows\System32\inetsrv\config\applicationHost.config

person Peter    schedule 30.03.2012

Я действительно сомневаюсь, что PublicKeyToken у Elmah - это abc123 ... Вам нужно использовать настоящий PublicKeyToken, который вы можете найти, если посмотрите на сборку в GAC. Это выглядит примерно так: b03f5f7f11d50a3a (это было для mscorlib.dll, так что это токен открытого ключа Microsoft).

person Erik A. Brandstadmoen    schedule 16.08.2011
comment
Неважно, в какой файл вы поместите объявление модуля, если он находится в разделе system.WebServer / modules. Это работает, если вы поместите DLL в папку bin приложения? - person Erik A. Brandstadmoen; 16.08.2011
comment
Так что это не имеет никакого отношения к тому, что DLL находится в GAC или нет, тогда ... Что Fusion Log Viewer сообщит вам, если вы сначала очистите свои временные файлы ASP.NET? - person Erik A. Brandstadmoen; 17.08.2011
comment
Он оказался пустым. Сборка однозначно рабочая от GAC. Это просто требует, чтобы эта аннотация кода на уровне приложения работала. Мне это указывает на проблему где-то в глобальных файлах machine.config или web.config, но я не знаю, что именно ... Кстати, большое спасибо за помощь. - person Bruce Llewellyn; 17.08.2011

РЕДАКТИРОВАТЬ: Я установил модули и обработчик непосредственно в IIS, и теперь он работает.

person Bruce Llewellyn    schedule 18.08.2011

Я пробовал все, что мог найти, чтобы заставить ELMAH работать из GAC на моей 64-битной машине Win7 Ultimate, и единственное, что наконец заставило его работать, - это регистрация обработчика elmah.axd и различных модулей в диспетчере IIS.

person K4GDW    schedule 31.12.2011