我正在尝试使用ELMAH来记录我的ASP.NET MVC应用程序中的错误,但是当我在控制器上使用[HandleError]属性时,ELMAH在发生错误时不会记录任何错误.
正如我猜测它,因为ELMAH只记录未处理的错误,[HandleError]属性正在处理错误,因此无需记录它.
我如何修改或如何修改属性,以便ELMAH可以知道有错误并记录它..
编辑:让我确保每个人都理解,我知道我可以修改那个不是我问的问题的属性... ELMAH在使用handleerror属性时会被绕过,这意味着它不会看到有错误因为它被处理了已经由属性...我要问的是有一种方法让ELMAH看到错误并记录它即使属性处理它...我搜索周围,没有看到任何方法调用强制它来记录错误....
是否可以使用ELMAH执行以下操作?
logger.Log(" something");
Run Code Online (Sandbox Code Playgroud)
我正在做这样的事情:
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
Run Code Online (Sandbox Code Playgroud)
ELMAH不会自动记录此异常,因为它已被处理.
我在我的ASP.NET项目中安装了ELMAH 1.1 .Net 3.5 x64,现在我收到此错误(每当我尝试查看任何页面时):
无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.尝试加载格式不正确的程序.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.尝试加载格式不正确的程序.
底部有更多错误详情.
我的Active Solution平台是"任何CPU",我在x64上运行x64 Windows 7,当然还有处理器.我们使用这个版本的ELMAH的原因是因为1.0 .Net 3.5(x86,它是它编译的唯一平台)在我们的x64 Windows服务器上给了我们同样的错误.
我已经尝试编译x86和x64,我得到了同样的错误.我已经尝试删除所有编译器输出(bin和obj).最后我直接引用了SQLite dll,这是项目在服务器上工作所不需要的东西,我有这个编译错误:
错误1警告错误:程序集生成 - 引用程序集'System.Data.SQLite.dll'针对不同的处理器MyProject
任何想法可能是什么问题?
更多错误详情:
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
堆栈跟踪:
[BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.一个试图加载程序使用不正确的格式.]
System.Reflection.Assembly._nLoad(的AssemblyName文件名,字符串的代码库,证据assemblySecurity,装配locationHint,StackCrawlMark&stackMark,布尔throwOnFileNotFound,布尔forIntrospection)0
System.Reflection.Assembly .nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,Assembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection)+43
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,Evidence assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection)+127 System. Reflection.Assembly.InternalLoad(字符串assemblyString,证据assemblySecurity,StackCrawlMark&stackMark,布尔forIntrospection)142 System.Reflection.Assembly.Load(字符串assemblyString)28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串的AssemblyName,布尔starDirective)+ 46[ConfigurationErrorsException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.一个试图加载程序使用不正确的格式.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串的AssemblyName,布尔starDirective)613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()203 System.Web.Configuration .CompilationSection.LoadAssembly(集信息AI)105个
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)178
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath用configPath,布尔supportLocalization,字符串outputAssemblyName)54
的System.Web .Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp)+232 …
有些人使用的是ELMAH而不是log4net.是什么让它变得更好?
我在回答Stack Overflow问题时发现了ELMAH 如何登录C#?
有人使用Elmah通过电子邮件发送例外吗?我已经通过SQL Server设置了Elmah日志记录,并且可以通过Elmah.axd页面查看错误页面,但我无法使电子邮件组件正常工作.这里的想法是获取电子邮件通知,以便我们可以更快地对异常做出反应.这是我的web.config(省略了不必要的部分),所有敏感数据都被***取代.即使我指定要连接的服务器,SMTP服务是否需要在本地计算机上运行?
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="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>
<appSettings/>
<connectionStrings>
<add name="elmah-sql" connectionString="Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***" />
</connectionStrings>
<elmah>
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sql" >
</errorLog>
<errorMail from="test@test.com"
to="test@test.com"
subject="Application Exception"
async="false"
smtpPort="25"
smtpServer="***"
userName="***"
password="***">
</errorMail>
</elmah>
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="CustomError.aspx">
<error statusCode="403" redirect="NotAuthorized.aspx" />
<!--<error statusCode="404" redirect="FileNotFound.htm" />-->
</customErrors>
<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, …Run Code Online (Sandbox Code Playgroud) 我试图在我的asp.net网站上使用elmah,但每当我尝试访问http:// localhost:port/elmah.axd时,我都会找到资源未找到异常.我的web.config如下所示.
<?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> …Run Code Online (Sandbox Code Playgroud) 我刚开始使用ELMAH并且是粉丝.我的团队支持大量的Web应用程序,我特别兴奋的是ELMAH允许我们将每个应用程序的异常保存到同一个MS SQL数据库表中.
我们还支持一些控制台,DLL和桌面应用程序.是否可以使用ELMAH DLL将这些应用程序中的异常记录到同一位置?
我们使用优秀的ELMAH来处理ASP.NET 3.5 Web应用程序中的未处理异常.除了使用REST功能使用的WCF服务之外,这对于所有站点都非常有效.当应用程序代码未处理的操作方法中发生异常时,WCF会以各种方式处理它,具体取决于服务协定和配置设置.这意味着该异常不会最终触发ELMAH使用的ASP.NET HttpApplication.Error事件.我知道要处理的两个解决方案是:
第一个选项非常简单,但并不完全是DRY.第二个选项仅要求您在实现属性和ErrorHandler后使用自定义属性装饰每个服务.我是根据Will的工作完成的,但我想在发布代码之前验证这是正确的方法.
有没有更好的方法让我错过了?
在MSDN documenation为IErrorHandler说,的HandleError方法是做记录的地方,但ELMAH访问HttpContext.Current.ApplicationInstance,即使HttpContext.Current可用,在此方法中为null.在ProvideFault方法中调用Elmah是一种解决方法,因为ApplicationInstance已设置,但这与API文档中描述的意图不匹配.我在这里错过了什么吗?文档确实声明您不应该依赖于在操作线程上调用的HandleError方法,这可能是ApplicationInstance在此范围内为空的原因.
我无法确保ELMAH的安全.我跟随了Phil Haacked的教程,唯一的区别是演示项目是一个Web应用程序,我的项目是一个网站.
<add verb="POST,GET,HEAD" path="/admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
<location path="admin">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)
使用前导"/"我收到"无法找到资源"的响应,如果我删除前导"/"一切正常,除了可以通过在/admin/elmah.axd前面附加目录名来绕过身份验证.
例如没有前导"/"
www.mysite.com/admin/elmah.axd - 触发身份验证
www.mysite.com/asdasdasd/admin/elmah.axd - 不会触发身份验证并显示ELMAH
如何在保持远程查看日志的同时确保ELMAH安全?
谢谢.
其他人注意:
以下Alan的回答结果如下.
www.mysite.com/admin/elmah.axd - 触发身份验证
www.mysite.com/admin/asdasdasd/elmah.axd - 触发身份验证
www.mysite.com/asdasdasd/admin/elmah.axd - 资源不能是找到.(正是我们想要的)
我安装了elmah.mvc nuget软件包并保留了默认配置,即设置发送电子邮件并将其插入SQL数据库.
在我使用Visual Studio主机的本地计算机上,我可以打开我的应用程序并访问/ elmah罚款以查看错误报告.但是,当我尝试访问/ elmah生产时,我得到两个错误,首先我收到403 access is denied服务器错误.然后在我的电子邮件中(来自elmah)我得到:
System.Web.HttpException: Server cannot set status after HTTP headers have been sent.
Run Code Online (Sandbox Code Playgroud)
任何人都知道这里发生了什么以及如何解决?谢谢.
到目前为止,我尝试了以下答案的建议:
在 <system.webServer>
<handlers>
<add name="elmah" verb="GET" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
</handlers>
Run Code Online (Sandbox Code Playgroud)
并在 <system.web>
<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
Run Code Online (Sandbox Code Playgroud)
我尝试将路径设置为两者elmah.axd并且简单~/elmah.所有仍然给出相同的错误,仍然在本地工作,但不在生产中.
编辑:它实际上也适用于我远程进入服务器并通过浏览器访问它(不使用localhost,但实际的站点地址).那么我没有什么许可?好像它是在服务器级别.