实现WCF IErrorHandler仅用于日志记录

kat*_*tit 5 .net c# 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

cad*_*ll0 3

您可以将其留空。我这样做是为了毫无问题地将错误记录到 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,首先调用 ProvideFault(),然后最终调用 HandleError(),如 MSDN 所示:http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx (3认同)