2010-06-08 4 views
45

ho cercato this soluzione Elmah.XmlFileErrorLog ma sto ottenendo seguente eccezioneELMAH - Eccezione di registrazione senza dover HttpContext

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: 

file web.config

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

Sto utilizzando Windows 7. può esserci qualche problema ad esso correlato?

UPDATE Nota: eseguo il servizio WCF sotto ASP.NET. Ad esempio, ho aggiunto il progetto Servizio WCF alla soluzione aggiungendo un nuovo sito Web e selezionando il modello di servizio WCF. Attualmente lo sto eseguendo dall'interno di IDE. Tuttavia, l'hosting su IIS non ha aiutato.

risposta

78

sto rispondendo alla mia domanda.

Ho provato ad aggiungere in seguito nel mio web.config

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

decorate anche il mio servizio con il seguente attributo

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

Ancora nessuna uso. Poi ho ottenuto la soluzione here con la quale è possibile utilizzare Elmah senza HTTPContext. cioè registrare gli errori scrivendo

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

invece di

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

Ho avuto lo stesso problema, il problema è dovuto all'istanza dell'applicazione che è nullo in un progetto WCF. Mi chiedo se si dovesse eseguire i servizi in un modello di progetto di applicazione Web si verifichino gli stessi problemi. –

+0

Quindi vuoi dire che il problema era che lo stavo usando come progetto di sito web invece di progetto di applicazione web? – IsmailS

+0

No, stavo suggerendo che il problema potrebbe riguardare il Template WCF, ho sbagliato però –

0

Si sta eseguendo questo codice all'interno di ASP.NET? Sembra che HttpContext sia nullo e questo sta facendo sì che il codice ELmah elimini l'eccezione: il metodo Elmah.ErrorSignal.FromCurrentContext() passerebbe a HttpContext.Current da quello che ricordo (da un po 'di tempo passato a guardarlo) a Elmah.ErrorSignal .FromContext (HttpContext context) metodo e questo sembra essere nullo, che normalmente non sarebbe il caso in Asp.Net ospitato roba.

Un'altra possibilità è che questo sta accadendo al di fuori di una richiesta al server in modo che il HttpContext potrebbe essere nullo

+0

Sto eseguendo il servizio WCF come sotto ASP.NET. Ad esempio, ho aggiunto il progetto Servizio WCF alla soluzione aggiungendo un nuovo sito Web e selezionando il modello di servizio WCF. Attualmente lo sto eseguendo dall'interno di IDE. Può risolvere se lo ospitiamo su IIS? – IsmailS

+1

Lo sto eseguendo su IIS e ho lo stesso problema –

1

L'unica soluzione stabile che ho trovato è quello di rimuovere l'attributo web.config e utilizzare il comportamento del servizio attribuire usano in Exception Logging for WCF Services using ELMAH

+0

+1 Grazie per lo sforzo compiuto per risolvere una domanda già contrassegnata come risposta su una soluzione temporanea. – IsmailS

+0

Io stesso stavo avendo lo stesso problema quindi non mi preoccupo –

+0

Detto questo, difficilmente si ottengono molte informazioni dalla richiesta HTTP di cui si ha bisogno quando si esegue il debug di un servizio WCF, quindi non sono sicuro che ne valga la pena. –

33

Grazie a tutti, ecco la mia classe ErrorHelper che mi è venuta in mente per registrare manualmente gli errori sui siti Web e nei servizi WCF, i servizi Windows, ecc:

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

Proprio quello che cercavo - Grazie – Steve

+0

Anch'io, grazie! – Grandizer

+2

Per chiunque provi a farlo e ottenga un errore "Argomento non valido", assicurati di aggiungere un riferimento a System.Web nella tua app di servizio/windows. – FirstDivision