我正在使用一个笨重的WCF服务器,偶尔会抛出各种异常,并且还将其中一些错误作为
我想要覆盖内部的WCF客户端请求调用方法,并处理由服务器返回的所有内部异常和硬编码错误,如果发生错误,则触发
当我调用
如何实现这一点? 我知道我不必使用生成的客户端,但我不想重新实现所有的合同,并且我想使用生成的
更新
我阅读了这个answer,看起来它部分符合我的要求,但我想知道是否有一种方法将
更新
(
结论
我需要实现两个方面:
1.封装在
2.解析所有服务器回复,并对其中一些回复抛出异常,以便它们像语句 1 中那样转发。
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
}
}
}
当我调用
myClient.GetHelloWorld()
时,它会经过我的重写方法。如何实现这一点? 我知道我不必使用生成的客户端,但我不想重新实现所有的合同,并且我想使用生成的
ClientBase
子类或至少其通道。
我需要控制内部请求调用方法。更新
我阅读了这个answer,看起来它部分符合我的要求,但我想知道是否有一种方法将
IErrorHandler
附加到仅消费者(客户端)代码,我想以某种方式将其添加到ClientBase<TChannel>
实例中。更新
这篇文章看起来很有前途,但它不起作用。应用的属性似乎没有生效。
我找不到在客户端添加IServiceBehavior
的方法。
更新
我尝试通过调用IEndpointBehavior.ApplyClientBehavior
附加一个IErrorHandler
:
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.CallbackDispatchRuntime.ChannelDispatcher.ErrorHandlers
.Add(new ErrorHandler());
}
(
clientRuntime
是一个参数),但异常仍然直接跳过 MyErrorHandler
抛出。
ApplyDispatchBehavior
根本没有被调用。结论
我需要实现两个方面:
1.封装在
BaseClient<TChannel>
生命周期中可能发生的所有异常,并决定是处理它们还是将它们抛出。这应该可以处理所有操作(我正在使用的服务公开了几十个)。2.解析所有服务器回复,并对其中一些回复抛出异常,以便它们像语句 1 中那样转发。
IOperationInvoker
只能通过ApplyDispatchBehavior
进行附加,它不是客户端的设施。 - Shimmy Weitzhandler