我有一个N-Tier项目,其中一个项目是Error Logging类库。为此,我为Elmah添加了Nuget包。基本上我正在做的是从抛出异常的方法中获取其他信息,将其打包在我创建的新异常中,并将其提供给ELMAH。
可以将类库添加到解决方案中的其他项目(服务层,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);
}
我的问题是,当我从UI(MVC)层调用此库代码时,我确实有一个HTTP上下文,它调用ELMAH。但是我不知道错误发生在哪里! 我的UI层是否需要使用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>
答案 0 :(得分:1)
我找到了答案。
线索的事实是,如果你需要一些appSettings,类库不会使用自己的App.config,而是从调用者的.config中提取它们。因此,对于调用此类库的MVC站点,appSettings应该在web.config中。
因此,为了安装ELMAH的类库,当我们有一个http上下文(来自一个网站)时,用ELMAH登录该网站的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>