2010-06-08 89 views
45

我試圖this溶液Elmah.XmlFileErrorLog,但我發現ELMAH - 異常記錄,而不必HttpContext的

<configSections> 
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
    <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
    <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
     <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
      <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
      <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
       <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> 
       <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
       <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
       <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
      </sectionGroup> 
     </sectionGroup> 
    </sectionGroup> 
    <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> 
<httpHandlers> 
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    <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"/> 
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
</httpModules> 
... 

<elmah> 
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data" /> 
    <security allowRemoteAccess="1" /> 
</elmah> 

我使用Windows 7以下異常

System.ArgumentNullException was unhandled by user code 
    Message="Value cannot be null.\r\nParameter name: context" 
    Source="Elmah" 
    ParamName="context" 
    StackTrace: 
     at Elmah.ErrorSignal.FromContext(HttpContext context) in c:\builds\ELMAH\src\Elmah\ErrorSignal.cs:line 67 
     at Elmah.ErrorSignal.FromCurrentContext() in c:\builds\ELMAH\src\Elmah\ErrorSignal.cs:line 61 
     at ElmahHttpErrorHandler.ProvideFault(Exception error, MessageVersion version, Message& fault) in c:\Myapplication\App_Code\Util\ElmahHttpErrorHandler.cs:line 19 
     at System.ServiceModel.Dispatcher.ErrorBehavior.ProvideFault(Exception e, FaultConverter faultConverter, ErrorHandlerFaultInfo& faultInfo) 
     at System.ServiceModel.Dispatcher.ErrorBehavior.ProvideMessageFaultCore(MessageRpc& rpc) 
     at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessageCleanup(MessageRpc& rpc) 
    InnerException: 

Web.config文件。會有什麼問題嗎?

UPDATE 注意:我正在運行WCF服務ASP.NET下。即我通過添加新網站將WCF服務項目添加到解決方案,然後選擇WCF服務模板。我目前正在IDE中運行它。在IIS上託管它也沒有幫助。

回答

78

我回答我的問題。

我試着在我的web.config中添加以下

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

還裝飾我的服務具有以下屬性

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]  
public class CalculatorService : ICalculatorSession  
{ 
    // Implement calculator service methods 
} 

還是沒有用。 然後我得到了解決方案here,通過它您可以在不使用HTTPContext的情況下使用Elmah。即通過寫

Elmah.ErrorLog.GetDefault(null).Log(new Error(ex)); 

,而不是

Elmah.ErrorSignal.FromCurrentContext().Raise(error); 
+0

我有同樣的問題,問題是由於在WCF項目中的應用程序實例爲空。 我不知道你是否在Web應用程序項目模板中運行服務會遇到同樣的問題。 – 2010-08-10 13:05:37

+0

所以,你的意思是說,我的問題是,我使用它作爲網站項目,而不是Web應用程序項目? – IsmailS 2010-08-11 05:01:30

+0

不,我建議這個問題可能與WCF模板有關,但我錯了 – 2010-08-12 15:27:53

0

您是否在ASP.NET內運行此代碼? 看起來像HttpContext爲空,這導致ELmah代碼拋出異常 - 方法Elmah.ErrorSignal.FromCurrentContext()會傳遞HttpContext.Current從我記得(已經有一段時間,因爲看着它)到Elmah.ErrorSignal .FromContext(HttpContext上下文)方法,這似乎是空的,這通常不會在Asp.Net託管的東西的情況下。

另一種可能性是,這是發生在服務器的請求外界如此的HttpContext可能爲空

+0

我作爲下面的ASP.NET運行WCF服務。即我通過添加新網站將WCF服務項目添加到解決方案,然後選擇WCF服務模板。我目前正在IDE中運行它。如果我在IIS上託管它,它可以解決嗎? – IsmailS 2010-06-09 05:15:35

+1

我在IIS上運行它,並有相同的問題 – 2010-08-10 13:06:22

1

唯一穩定的解決方案,我能找到是去除web.config文件的屬性和使用屬性他們Exception Logging for WCF Services using ELMAH

+0

+1感謝您爲解決已在臨時解決方案中標記答案的問題而付出的努力。 – IsmailS 2010-08-11 05:06:50

+0

我自己也有同樣的問題,所以不用擔心 – 2010-08-12 15:26:42

+0

這就是說,在調試WCF服務時,您幾乎不需要從HTTP請求本身獲取足夠的信息,因此我不確定這是值得付出的努力。 – 2010-08-12 15:29:40

33

使用服務行爲記錄錯誤謝謝大家,這裏是我想到的ErrorHelper類,用於在網站和WCF服務,Windows服務等中手動記錄錯誤:

public static class ErrorHelper 
{ 
    /// <summary> 
    /// Manually log an exception to Elmah. This is very useful for the agents that try/catch all the errors. 
    /// 
    /// In order for this to work elmah must be setup in the web.config/app.config file 
    /// </summary> 
    /// <param name="ex"></param> 
    public static void LogErrorManually(Exception ex) 
    { 
     if (HttpContext.Current != null)//website is logging the error 
     {     
      var elmahCon = Elmah.ErrorSignal.FromCurrentContext(); 
      elmahCon.Raise(ex); 
     } 
     else//non website, probably an agent 
     {     
      var elmahCon = Elmah.ErrorLog.GetDefault(null); 
      elmahCon.Log(new Elmah.Error(ex)); 
     } 
    } 
} 
+0

正是我之後 - 謝謝 – Steve 2012-06-22 11:17:37

+0

我也是,謝謝! – Grandizer 2013-06-19 19:16:16

+2

對於任何嘗試此操作並獲得「無效參數」錯誤的人,請確保在service/windows應用程序中添加對System.Web的引用。 – FirstDivision 2013-10-24 16:22:25