【发布时间】:2015-11-16 11:48:31
【问题描述】:
我正在使用一个笨重的 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
}
}
}
所以当我调用myClient.GetHelloWorld() 时,它会通过我被覆盖的方法。
如何做到这一点?
我知道我不必使用生成的客户端,但我不想再次重新实现所有合约,我想使用生成的ClientBase 子类或至少它的频道。
我需要的是控制内部请求调用方法。
更新
我读了这个answer,看起来它部分是我正在寻找的,但我想知道是否有一种方法可以将IErrorHandler 附加到仅消费者(客户端)代码,我想添加它以某种方式传递给ClientBase<TChannel> 实例。
更新
This 文章看起来也很有希望,但它不起作用。应用的属性似乎没有生效。
我找不到将IServiceBehavior 添加到客户端的方法。
更新
我尝试通过IEndpointBehavior.ApplyClientBehavior 调用附加IErrorHandler:
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.CallbackDispatchRuntime.ChannelDispatcher.ErrorHandlers
.Add(new ErrorHandler());
}
(clientRuntime是一个参数),但是直接跳过MyErrorHandler还是会抛出异常。ApplyDispatchBehavior根本不被调用。
结论
我需要实现两个方面:
- 包装在
BaseClient<TChannel>的生命周期内可能发生的所有异常,并决定是处理它们还是抛出它们。这应该负责所有操作(我正在使用的服务暴露了几十个) - 解析所有服务器回复并为其中一些抛出异常,因此它们按照语句 1 进行转发。
【问题讨论】:
-
您是否有权访问该服务的 app.config 或 web.config?
-
@DavidP 我无权访问服务器代码。此外,我更喜欢以编程方式设置我的配置,而不是使用应用设置或应用配置。
-
好的 - 我想我明白你现在想要做什么。服务是返回异常,还是成功返回字符串消息?
-
@DavidP 两者。我需要处理这两种情况,另外我还想在同一个地方处理服务器关闭或其他一般异常。
-
IOOperationInvoker 文章是解决您的问题的正确方法。您可以在客户端使用它。不要在客户端将其添加为 IServiceBehavior。将其添加为 IOperationBehavior 或 IEndpointBehavior。
标签: c# wcf wcf-client