7

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

2 回答 2

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);
    }
}

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

于 2012-06-13T20:24:59.390 回答
2

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

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

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

于 2014-02-07T01:05:16.433 回答