Elmah для приложений без протокола HTTP ИЛИ Elmah без HttpContext - PullRequest
5 голосов
/ 22 мая 2010

Мы работаем над 3-уровневым приложением, и нам разрешено использовать самые последние и лучшие версии (MVC2, IIS7.5, WCF, SQL2k8 и т. Д.). Уровень приложений предоставляется различным веб-приложениям службами WCF. Так как мы контролируем и службу, и клиентскую часть, мы решили использовать привязки net.tcp для повышения производительности по сравнению с HTTP.

Мы хотели бы использовать ELMAH для регистрации ошибок, как в веб-приложениях, так и в сервисах. Вот мой вопрос. Существует много информации об использовании ELMAH с WCF, но это все для привязок HTTP. Кто-нибудь знает, можно ли / как использовать ELMAH со службами WCF, предоставляющими конечные точки, отличные от HTTP?

Полагаю, нет, потому что ELMAH хочет HttpContext, для которого требуется, чтобы флаг AspNetCompatibilityEnabled имел значение true в web.config. От MSDN :

IIS 7.0 и WAS позволяют службам WCF взаимодействовать по протоколам, отличным от HTTP. Однако службам WCF, работающим в приложениях, в которых включен режим совместимости ASP.NET, запрещается предоставлять конечные точки, отличные от HTTP. Такая конфигурация генерирует исключение активации, когда служба получает свое первое сообщение.

Если это правда, что вы не можете использовать ELMAH со службами WCF, имеющими конечные точки, отличные от HTTP, тогда возникает следующий вопрос: можем ли мы использовать ELMAH таким образом, чтобы не требовался HttpContext? Или, в более общем смысле (чтобы не фиксировать ошибку thin metal ruler ), есть ЛЮБОЙ способ использовать ELMAH со службами WCF, имеющими конечные точки, отличные от HTTP?

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

Ответы [ 4 ]

5 голосов
/ 31 мая 2010

Нет.ELMAH - это модуль HTTP, и если вы не отправляете HTTP-запросы, ELMAH ничего не сделает

2 голосов
/ 11 июня 2010

Возможно как ниже

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

Ссылка: http://groups.google.com/group/elmah/browse_thread/thread/9ea4b51420fd5dfa

Ранее я пробовал это решение для службы WCF в дополнение к режиму AspNetCompatibility, и оно не работало на службе WCF, размещенной на IIS, но оно работало на службе WCF, размещенной на сервере dev в Visual Studio. Поэтому мне пришлось довольствоваться вышеуказанным решением.

0 голосов
/ 08 февраля 2011

Мы используем блок обработки исключений Enterprise Library совместно с ELMAH для регистрации исключений. Вместо того, чтобы использовать какие-либо модули HTTP, он использует журнал вызовов непосредственно в ELMAH.

 public class ErrorHandlerServiceBehaviour : BehaviorExtensionElement, IServiceBehavior
    {
        #region BehaviourExtensionElement Members

        public override Type BehaviorType
        {
            get { return typeof(ErrorHandlerServiceBehaviour); }
        }

        protected override object CreateBehavior()
        {
        return new ErrorHandlerServiceBehaviour();
    }

    #endregion

    #region IServiceBehavior Members

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
        {
            channelDispatcher.ErrorHandlers.Add(new ElmahExceptionHandler());
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }

    #endregion

}

Тогда ExceptionHandler

 public class ElmahExceptionHandler : IErrorHandler
    {
        #region IErrorHandler Members

        public bool HandleError(Exception error)
        {
            return ExceptionPolicy.HandleException(error, "ServiceExceptions");
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {

        }

        #endregion
    }

затем в разделе политик исключений библиотеки предприятия в app.config

<exceptionHandling>
    <exceptionPolicies>    
    <add name="ServiceExceptions">
        <exceptionTypes>
          <add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            postHandlingAction="NotifyRethrow" name="Exception">
            <exceptionHandlers>
              <add type="DB.Framework.Logging.ElmahExceptionHandler, DinguBlue.Framework.Logging"
                name="Elmah Exception Handler" />
            </exceptionHandlers>
          </add>
        </exceptionTypes>
      </add>
    </exceptionPolicies>    
</exceptionHandling>

см. Например http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspx

0 голосов
/ 27 мая 2010

Вы пытались использовать метод static void AppInitialize () {} для его инициализации? Он работает с конечными точками, отличными от HTTP, при инициализации связанных с WCF вещей.

Для получения дополнительной информации см. Превосходное сообщение в блоге Вэньлун Донга: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

НТН,

- larsw

...