2010-05-22 2 views
5

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

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

Мое предположение - нет, потому что ELMAH хочет HttpContext, для которого флаг AspNetCompatibilityEnabled должен быть истинным в файле 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, но я стараюсь избегать разметки кода.

+0

Может проверить это для использования Elmah в консольных приложениях - некоторые из них могут быть полезны в вашей ситуации: http://stackoverflow.com/questions/841451/using-elmah-in-a-console-application – user1191559

ответ

5

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

+0

Да, это своего рода вывод, к которому я пришел. Я попытался создать поддельные объекты HttpContext и не очень далеко. – Josh

+1

Возможно. См. Мой ответ ниже. – IsmailS

+0

это неправда !!! вы можете использовать elmah на любом коде! [google groups - прокрутите вниз] (https://groups.google.com/forum/#!topic/elmah/nqS1FCD9Xfo) – Yuki

0

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

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

HTH,

--larsw

+0

Я не понимаю, что это заставляет нас. AppInitialize - возможная замена Application_Start в приложениях, отличных от HTTP, но это не срабатывает при каждом запросе или создании контекста. – Josh

2

это можно, как показано ниже

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

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

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

+0

Благодарим вас за ответ. К сожалению, Visual Studio не поддерживает привязки net.tcp для сервисов WCF (или любых привязок к HTTP, если на то пошло). Это означает, что вы тестировали действительно стандартное поведение Elmah для приложений HTTP. – Josh

+0

не забудьте добавить имя приложения в конфигурацию elmah. это будет работать! – Yuki

0

Мы используем блок обработки исключений 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

Смежные вопросы