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