用于非HTTP协议应用程序的Elmah或没有HttpContext的Elmah

时间:2010-05-22 00:05:28

标签: wcf elmah httpcontext was net.tcp

我们正在开发一个3层应用程序,我们已被允许使用最新和最好的(MVC2,IIS7.5,WCF,SQL2k8等)。 WCF服务将应用程序层公开给各种Web应用程序。由于我们控制服务和客户端,因此我们决定使用net.tcp绑定来提高其在HTTP上的性能优势。

我们希望在网络应用和服务上使用ELMAH进行错误记录。这是我的问题。有很多关于将ELMAH与WCF一起使用的信息,但它都适用于HTTP绑定。有谁知道是否/如何使用ELMAH与WCF服务公开非HTTP端点?

我的猜测是否定的,因为ELMAH想要HttpContext,它需要{。3}}标志在web.config中为真。来自AspNetCompatibilityEnabled

  

IIS 7.0和WAS允许WCF服务通过HTTP以外的协议进行通信。但是,不允许在启用ASP.NET兼容模式的应用程序中运行的WCF服务公开非HTTP端点。当服务收到第一条消息时,这样的配置会生成激活异常。

如果您不能将ELMAH与具有非HTTP端点的WCF服务一起使用,那么后续问题是:我们能否以不需要HttpContext的方式使用ELMAH? 或者更一般地说(以便不提交MSDN错误),有没有办法将ELMAH与具有非HTTP端点的WCF服务一起使用?

注意:我知道我们可以下载Elmah源代码并将其更改为添加填充程序或删除HttpContext依赖项,但我正在尝试避免分叉代码。

4 个答案:

答案 0 :(得分:5)

没有。 ELMAH是一个HTTP模块,除非您提供HTTP请求,否则ELMAH将不会执行任何操作

答案 1 :(得分:2)

可以如下

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

参考: http://groups.google.com/group/elmah/browse_thread/thread/9ea4b51420fd5dfa

之前我曾尝试使用this WCF服务解决方案以及AspNetCompatibility模式,它在IIS托管的WCF服务上没有用,但是它正在Visual Studio中开发服务器托管的WCF服务。因此,我不得不满足于上述解决方案。

答案 2 :(得分:0)

您是否尝试过使用static void AppInitialize(){}方法进行初始化?在初始化WCF相关事物时,它适用于非HTTP端点。

有关更多信息,请参阅Wenlong Dong的精彩博文: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

HTH,

- larsw

答案 3 :(得分:0)

我们将Enterprise Library Exception Handling块与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