我正在消耗一个笨重的WCF服务器,偶尔会抛出各种异常,并且还会返回一些错误string.我根本无法访问服务器代码.
我想覆盖内部WCF客户端请求调用方法并处理服务器返回的所有内部异常和硬编码错误,并在Fault发生错误时引发事件,伪:
class MyClient : MyServiceSoapClient
{
protected override OnInvoke()
{
object result;
try
{
result = base.OnInvoke();
if(result == "Error")
{
//raise fault event
}
catch
{
//raise fault event
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我打电话时myClient.GetHelloWorld(),它通过我的重写方法.
怎么能实现这一目标?
我知道我不必使用生成的客户端,但我不想再次重新实现所有的合同,我想使用生成的ClientBase子类或至少它的通道.
我需要的是控制内部请求调用方法.
更新
我读了这个答案,看起来它部分是我正在寻找的,但我想知道是否有办法只附加一个IErrorHandler消费者(客户端)代码,我想以ClientBase<TChannel>某种方式将它添加到实例.
更新
这篇文章看起来很有希望,但它不起作用.应用的属性似乎没有生效.我找不到添加IServiceBehavior到客户端的方法.
更新
我试图安装一个IErrorHandler通过IEndpointBehavior.ApplyClientBehavior调用:
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.CallbackDispatchRuntime.ChannelDispatcher.ErrorHandlers
.Add(new ErrorHandler());
}
Run Code Online (Sandbox Code Playgroud)
(clientRuntime是一个参数),但仍会直接跳过异常跳转MyErrorHandler …
我已经阅读了几篇关于构建自定义ErrorHandler的文档(通过继承IErrorHandler).不幸的是,我对如何做到有几点疑虑.
问题是我并不完全理解IErorrHandler的两个方法的含义(即ProvideFault和HandleError).对我来说,HandleError用于处理异步逻辑(例如登录).但是,在这种情况下,为什么这个方法返回一个布尔值?我还认为可以使用另一种方法来确定错误是应该传播到客户端还是传播给其他人.
我错了吗 ?