2010-06-08 14 views
45

me trataron this solución con Elmah.XmlFileErrorLog Pero estoy siguiente excepciónELMAH - Excepción de registro sin tener 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: 

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

estoy usando windows 7. ¿Puede haber algún problema relacionado con esto?

ACTUALIZACIÓN Nota: Estoy ejecutando WCF service unders ASP.NET. es decir, agregué el proyecto de servicio WCF a la solución mediante Agregar nuevo sitio web y luego seleccioné la plantilla del Servicio WCF. Actualmente lo estoy ejecutando desde IDE. Sin embargo, alojarlo en IIS tampoco ayudó.

Respuesta

78

Estoy respondiendo a mi propia pregunta.

He intentado añadir siguiente en mi web.config

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

decorada también con mi servicio atributo siguiente

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

Aún no sirve. Luego obtuve la solución here mediante la cual puede usar Elmah sin HTTPContext. es decir, registrar los errores al escribir

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

en lugar de

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

Tuve el mismo problema, el problema se debe a que la instancia de la aplicación es nula en un proyecto de WCF. Me pregunto si debe ejecutar los servicios en una plantilla de proyecto de aplicación web si tuviera los mismos problemas. –

+0

¿Quiere decir que el problema fue que lo estaba usando como proyecto de sitio web en lugar de proyecto de aplicación web? – IsmailS

+0

No, yo estaba sugiriendo que el problema podría estar relacionado con la Plantilla WCF. Sin embargo, me equivoqué –

0

¿Está ejecutando este código dentro de ASP.NET? Parece que HttpContext es nulo y esto está causando que el código ELmah lance la excepción -el método Elmah.ErrorSignal.FromCurrentContext() pasaría HttpContext.Current de lo que recuerdo (hace tiempo que lo analicé) al Elmah.ErrorSignal El método .FromContext (HttpContext context) y esto parece ser nulo, lo que normalmente no sería el caso en Asp.Net alojado.

Otra posibilidad es que esto está ocurriendo fuera de una petición al servidor por lo que el HttpContext podría ser nula

+0

Estoy ejecutando el servicio WCF como unders ASP.NET. es decir, agregué el proyecto de servicio WCF a la solución mediante Agregar nuevo sitio web y luego seleccioné la plantilla del Servicio WCF. Actualmente lo estoy ejecutando desde IDE. ¿Se puede resolver si lo hospedo en IIS? – IsmailS

+1

Lo estoy ejecutando en IIS y tengo el mismo problema –

1

La única solución estable que pude encontrar es para quitar el atributo web.config y utilizar el comportamiento en servicio de atributos que utilizan en Exception Logging for WCF Services using ELMAH

+0

+1 Gracias por el esfuerzo realizado para resolver una pregunta que ya estaba marcada como respuesta en una solución temporal. – IsmailS

+0

Estaba teniendo el mismo problema yo mismo así que no me preocupe –

+0

Dicho esto, apenas obtiene mucha información de la solicitud HTTP que necesita al depurar un servicio WCF, así que no estoy seguro de que valga la pena el esfuerzo. –

33

Gracias a todos, aquí está mi clase ErrorHelper que se me ocurrió para registrar manualmente los errores en los sitios web y en los servicios de WCF, servicios de Windows, etc .:

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

Justo lo que estaba buscando - Gracias – Steve

+0

¡Yo también, gracias! – Grandizer

+2

Para cualquier otra persona que intente esto y obtenga un error de "argumento no válido", asegúrese de agregar una referencia a System.Web en su aplicación de servicio/Windows. – FirstDivision

Cuestiones relacionadas