ELMAH - ведение журнала исключений без HttpContext

Я попробовал это решение с Elmah.XmlFileErrorLog, но я У меня следующее исключение

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

<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. может быть с этим проблема?

ОБНОВЛЕНИЕ Примечание. Я использую службу WCF под ASP.NET. то есть я добавил в решение проект службы WCF, добавив новый веб-сайт, а затем выбрав шаблон службы WCF. В настоящее время я запускаю его из среды IDE. Однако размещение его на IIS тоже не помогло.


person IsmailS    schedule 08.06.2010    source источник


Ответы (4)


Я отвечаю на свой вопрос.

Я попытался добавить следующее в свой web.config

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

Также мой Сервис украшен следующим атрибутом

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

По-прежнему бесполезно. Затем я получил здесь решение, с помощью которого вы можете использовать Elmah без HTTPContext. т.е. регистрировать ошибки, записывая

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

вместо

Elmah.ErrorSignal.FromCurrentContext().Raise(error);
person IsmailS    schedule 28.06.2010
comment
У меня была такая же проблема, проблема связана с тем, что экземпляр приложения имеет значение NULL в проекте WCF. Интересно, если бы вы запускали службы в шаблоне проекта веб-приложения, столкнулись бы вы с теми же проблемами. - person ; 10.08.2010
comment
Значит, вы имеете в виду, что проблема заключалась в том, что я использовал его как проект веб-сайта, а не проект веб-приложения? - person IsmailS; 11.08.2010
comment
Нет, я предполагал, что проблема может быть связана с шаблоном WCF, хотя я ошибался - person ; 12.08.2010
comment
Это спасло меня, спасибо! Вы можете отметить еще одну вещь. Если вы используете тип SQLErrorLog, вы должны указать пару ключ / значение applicationName в теге errorLog, иначе вы не сможете видеть записи вне контекста в журнале, потому что имя приложения по умолчанию назначается из HTTPContext, когда это присутствует. Например ‹errorLog type = Elmah.SqlErrorLog, Elmah connectionStringName = ApplicationServices applicationName = Sysdine /› - person David C; 29.03.2012
comment
Спасибо @DavidC за информацию, я этого не знал. - person IsmailS; 30.03.2012
comment
Спасибо @DavidC за подсказку. Однако кто-нибудь знает про emailLog? Я не слишком много в это разбирался, но мой быстрый всплеск показывает, что даже с указанным applicationName emailLog никогда не отправляет его (работает с ... FromCurrentContext () ...). Хотя должен отметить, что запускаю его в асинхронной задаче. - person Ted; 28.02.2014
comment
привет, это решение устранило проблему, но я не могу получать электронную почту, когда использую Elmah.ErrorLog.GetDefault (null) .Log (new Elmah.Error (ex)); - person Kaushik Thanki; 16.11.2016

Спасибо всем, вот мой класс 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));
        }
    }
}
person jhilden    schedule 06.06.2012
comment
То, что мне было нужно - спасибо - person Steve; 22.06.2012
comment
Для всех, кто пытается это сделать и получить ошибку недопустимого аргумента, убедитесь, что вы добавили ссылку на System.Web в своем приложении службы / Windows. - person FirstDivision; 24.10.2013
comment
Ссылка на System.Web меня спасла! Спасибо @FirstDivision - person Reuel Ribeiro; 12.03.2019

Вы запускаете этот код в ASP.NET? Похоже, что HttpContext имеет значение null, и это приводит к тому, что код ELmah генерирует исключение - метод Elmah.ErrorSignal.FromCurrentContext () передает HttpContext.Current из того, что я помню (какое-то время с тех пор, как я изучал его), в Elmah.ErrorSignal. FromContext (контекст HttpContext), и это кажется нулевым, чего обычно не бывает в материалах, размещенных на Asp.Net.

Другая возможность заключается в том, что это происходит вне запроса к серверу, поэтому HttpContext может быть нулевым.

person saret    schedule 08.06.2010
comment
Я использую службу WCF под ASP.NET. то есть я добавил в решение проект службы WCF, добавив новый веб-сайт, а затем выбрав шаблон службы WCF. В настоящее время я запускаю его из среды IDE. Может ли это разрешиться, если я размещу его на IIS? - person IsmailS; 09.06.2010
comment
Я запускаю его на IIS и имею ту же проблему - person ; 10.08.2010

Единственное стабильное решение, которое я смог найти, - это удалить атрибут web.config и использовать атрибут поведения службы, который они используют в Ведение журнала исключений для служб WCF с использованием ELMAH

person Community    schedule 10.08.2010
comment
+1 Спасибо за усилия, которые вы предприняли, чтобы решить вопрос, уже отмеченный ответом на временное решение. - person IsmailS; 11.08.2010
comment
У меня была такая же проблема, так что не беспокойтесь - person ; 12.08.2010
comment
Тем не менее, вы вряд ли получите много информации из самого HTTP-запроса, которая вам нужна при отладке службы WCF, поэтому я не уверен, что это того стоит. - person ; 12.08.2010