Error handling 将所有内部服务器错误插入windows事件日志

Error handling 将所有内部服务器错误插入windows事件日志,error-handling,wcf,event-log,Error Handling,Wcf,Event Log,我开发了一个处理HTTP请求的小型WCF服务 我想知道发生的每一个故障: 从contracts视图中导致500个内部服务器错误的所有内容 从bindings视图中导致CommunicationException的所有内容(我已经编写了一个自定义视图,但也使用标准视图) 错误应放入windows事件日志中 我的问题是: 是否有可能为整个WCF堆栈添加一个中央事件处理程序,用于捕获所有异常并将其打印到事件日志中 您好。您可以为此目的使用。在服务器端-是的,正如John已经指出的,您基本上可以

我开发了一个处理HTTP请求的小型WCF服务

我想知道发生的每一个故障:

  • 从contracts视图中导致500个内部服务器错误的所有内容
  • 从bindings视图中导致CommunicationException的所有内容(我已经编写了一个自定义视图,但也使用标准视图)
错误应放入windows事件日志中

我的问题是:

  • 是否有可能为整个WCF堆栈添加一个中央事件处理程序,用于捕获所有异常并将其打印到事件日志中

您好。

您可以为此目的使用。

在服务器端-是的,正如John已经指出的,您基本上可以在服务类上实现
IErrorHandler
接口,并捕获该端的所有错误

然而,在客户端,您只需使用旧的.NET
try{…}catch{…}
来保护所有服务调用,毕竟,您可能会

  • 调用一个根本不存在的服务器
  • 调用暂时不可用的服务器
  • 松散的网络连接(一个拿着大推土机的家伙切断了你的网络线:-)
  • 更多这样的事情
这些将是
通信异常
(或其后代),必须在发生时在客户端进行处理

因此,您可以集中处理服务器端的事情(至少只要消息已经传递到您的服务类并正在处理中),其他任何事情都必须单独处理


Marc

我已经在定制绑定通道的ReceiveRequest方法中插入了一个“抛出新的CommunicationException(“出错”)”。自定义错误处理程序是通过“foreach(h.ChannelDispatchers中的ChannelDispatcher cd){cd.ErrorHandlers.Add(new MyErrorHandler());}插入的但是,我的自定义错误处理程序在任何时候都不会被调用。我认为您抛出得太早了!:-)如果我没记错的话,IErrorHandler接口只有在服务器端的dispatcher将消息发送到服务对象的方法后才会生效。在此之前的任何内容都将直接发送回客户端并放入“将新的CommunicationException(“error”)“抛出到合同的实现中也不起作用。如果不是分派之前的异常,而不是分派之后的异常,errorhandler会处理哪些异常?IErroHandler是为“普通”服务实现者设计的,它会处理在执行服务方法期间发生的所有错误(通常占所有错误的99%)。我认为“服务实现者”是正确的是实现该协定的类吗?例如,如果我有一个带有Divide函数的ICalculator协定,当客户端试图在该协定的实现上除以零时,应该调用错误处理程序?如果是,如果只添加“throw new Exception(“error”),为什么它没有得到invoke对于这样一个函数的主体?对于ServiceModel,它应该是相同的,还是我的想法是错误的?