实现WCF IErrorHandler仅用于日志记录

时间:2012-06-13 20:17:55

标签: c# .net wcf ierrorhandler

可能是微不足道的问题..我想实现自己的错误处理程序来记录错误并监视正在发生的事情。此时我不想向客户提供自己的错误。我希望它是透明的 - 就像默认的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;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你可以把它留空。我这样做是为了将错误记录到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);
    }
}

true中返回HandleError会让WCF认为没有发生错误。这意味着如果您只记录错误,则应始终返回false。如果未处理错误,则调用ProvideFault,这是您要进行日志记录的位置。您不需要提供错误消息。

答案 1 :(得分:2)

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

  

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

上面的链接还指出,在将响应发送回客户端后,只有HandleError被称为。所以对你的客户端好一点(不要让他们在你登录时等待),将ProvideFault留空并在HandleError中执行日志记录操作。