【问题标题】:Implementing WCF IErrorHandler for logging only实现 WCF IErrorHandler 仅用于日志记录
【发布时间】:2012-06-13 20:17:54
【问题描述】:

可能是微不足道的问题.. 我想实现自己的错误处理程序来记录错误并监控正在发生的事情。在这一点上,我不想向客户提供我自己的错误。我希望它是透明的——就像默认的 WCF 行为一样。我应该如何实现ProvideFault 来实现这一点?

namespace IDATT.Web.Services
{
    using System;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Dispatcher;

    public class MyServiceErrorHandler : IErrorHandler 
    {
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            // ????
        }

        public bool HandleError(Exception error)
        {
            return true;
        }
    }
}

【问题讨论】:

    标签: c# .net wcf ierrorhandler


    【解决方案1】:

    你可以把它留空。我这样做是为了毫无问题地将错误记录到 Elmah。

    编辑

    我完全错了。查看我的实现后,我执行以下操作。如您所见,HandleError 是基本上为空的方法,日志记录发生在ProvideFault。

    public class ElmahErrorHandler : IErrorHandler
    {
        public bool HandleError(Exception error)
        {
            return false;
        }
    
    
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            if (error == null)
            {
                return;
            }
    
            ErrorSignal.FromCurrentContext().Raise(error);
        }
    }
    

    在HandleError 中返回true 将使WCF 认为没有发生错误。这意味着如果你只是记录错误,这应该总是返回false。如果错误没有得到处理,ProvideFault 会被调用,这就是你想要进行日志记录的地方。您无需提供故障消息。

    【讨论】:

    • ErrorSignl.FromCurrentContext().Raise(error) 到底是做什么的?为什么你从 HandleError 返回“false”?
    • 这是对 Elmah 的特定调用以记录错误。至于我为什么返回false,请查看更新后的答案。
    • 好的,如果我返回 false 那么我可以将 ProvideFault 留空吗?这是正确的,它甚至不会被调用?
    • 典型的模式是 HandleError 要么纠正错误并返回 true,要么返回 false。然后,如果错误未处理(HandleError 返回 false),则在 ProvideFault 中记录错误。
    • 请注意,ProvideFault() 被调用 首先,然后最终 HandleError() 被调用,如 MSDN:msdn.microsoft.com/en-us/library/…
    【解决方案2】:

    来自文档 (http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx):

    实现 HandleError 方法以确保与错误相关的行为, 包括错误记录、确保快速失败、关闭 应用程序等。

    上面的链接还指出,只有在响应发送回客户端后调用了 HandleError。所以请善待您的客户(不要让他们在您登录时等待),将 ProvideFault 留空并在 HandleError 中执行日志记录操作。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 2016-08-11
      • 1970-01-01
      • 2017-06-26
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多