2015-06-18 3 views
0

У меня есть проект N-Tier, один из проектов - библиотека классов журнала ошибок. К этому я добавил пакет Nuget для Elmah. По сути дела, я беру дополнительную информацию из метода, который забрасывал исключение, упаковывая его в новое исключение, которое я создаю, и даю это ELMAH.ELMAH в библиотеке классов, нужен ли веб-пользовательскому интерфейсу ELMAH?

Библиотека классов может быть добавлена ​​в другие проекты в решении (Service Layer, UI). Когда нет HTTP-контекста, я записываю в файл в данный момент.

string details = BuildExceptionString(exception, extraDetails, arguments); 
LoggingModuleException ex = new LoggingModuleException(details); 

// We may have come from a website, or a backend layer. Handle both. 
if (HttpContext.Current != null) 
{ 
    ErrorSignal.FromCurrentContext().Raise(ex); // ELMAH Signaling 
} 
else 
{ 
    // Not a web app so no httpcontext 
    System.IO.File.WriteAllText(@"C:\MyLogs\Log.txt", ex.Message); 
} 

Мой вопрос, когда я называю этот код библиотеки из пользовательского интерфейса (MVC) слой у меня есть HTTP-контекст, и это вызывает ELMAH. Однако я не знаю, куда идут ошибки! Должен ли мой слой пользовательского интерфейса иметь ELMAH для вызова функции Raise()?

Когда я добавил ELMAH в свою библиотеку классов, у меня не было никакого файла .config. Я добавил App.config с некоторыми настройками ELMAH, которые я скопировал из другого вопроса. Я вставил его ниже, но я не могу сказать, что он используется библиотекой классов вообще ...

<?xml version="1.0" encoding="utf-8"?> 
<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"/> 
    <section name="errorTweet" requirePermission="false" type="Elmah.ErrorTweetSectionHandler, Elmah"/> 
</sectionGroup> 
</configSections> 
<elmah> 
<security allowRemoteAccess="yes" /> 
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="C:\MyLogs\Elmah\" /> 
</elmah> 
<system.web> 
<httpModules> 
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
</httpModules> 

<httpHandlers> 
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
</httpHandlers> 
</system.web> 
<location path="elmah.axd"> 
<system.web> 
    <authorization> 
    <deny users="?"/> 
    </authorization> 
</system.web> 
</location> 
</configuration> 

ответ

1

Я нашел ответ.

Ключ был в том, что если вам нужны некоторые приложения, библиотека классов НЕ использует свой собственный App.config, а вместо этого вытаскивает их из .config вызывающего. Поэтому для сайта MVC, вызывающего эту библиотеку классов, appSettings должен быть в файле web.config.

Для того чтобы библиотека классов, в которой установлен ELMAH, для регистрации с ELMAH, когда у нас есть контекст http (пришедший с веб-сайта), web.config веб-сайта нуждается в информации конфигурации ELMAH, которую библиотека классов будет прочитайте & использование.

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

// ...

<system.web> 
//... 
<httpModules> 
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" /> 
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" /> 
</httpModules> 

// ...

</runtime> 
<system.webServer> 
<validation validateIntegratedModeConfiguration="false" /> 
<modules> 
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" /> 
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" /> 
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" /> 
</modules> 
</system.webServer> 
<elmah> 
<security allowRemoteAccess="false" /> 
</elmah> 
<location path="elmah.axd" inheritInChildApplications="false"> 
<system.web> 
    <httpHandlers> 
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </httpHandlers> 
</system.web> 
<system.webServer> 
    <handlers> 
    <add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" /> 
    </handlers> 
</system.webServer> 
</location>