我想重写生成的代理 (ClientBase
) 的 Dispose 方法,因为处理代理会调用 Close 并在 channel 出现故障时抛出异常。
我想到的唯一方法是为我生成的代理创建一个部分类,使其继承自 IDisposable
:
public partial class MyServiceProxy : IDisposable
{
#region IDisposable Members
public void Dispose()
{
if (State != System.ServiceModel.CommunicationState.Faulted)
Close();
else
Abort();
}
#endregion
}
我做了一些测试,我的 Dispose
方法确实被调用了。
您认为此策略有任何问题吗?
此外,我不喜欢必须为每个生成的代理创建这个部分类的事实。
如果我能够让我的代理从基类继承就好了...
最佳答案
没有问题。以这种方式自定义设计器生成的代码正是部分类旨在提供的功能,这是处理 ClientBase
上损坏的 IDisposable
实现的推荐方法之一>.
至于必须为每个 WCF 客户端重新实现此代码 - 不幸的是,是的,如果你想对这些客户端使用 IDisposable
模式,你会的。您可以将 if/else
block 提取到实用程序方法中,但您仍然必须为每个 block 创建一个分部类并覆盖 Dispose
。
鉴于上面的操作相当繁琐,许多人选择使用 Service Proxy Helper相反,因为它不需要编写任何新代码。
我自己使用了一个稍微修改过的版本:
public static class Service<TProxy>
where TProxy : ICommunicationObject, IDisposable, new()
{
public static void Using(Action<TProxy> action)
{
TProxy proxy = new TProxy();
bool success = false;
try
{
action(proxy);
proxy.Close();
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
}
}
允许编写这种代码:
Service<MyServiceClient>.Using(svc => svc.PerformOperation());
或者:
Service<MyServiceClient>.Using(svc =>
{
var result = svc.PerformOperation();
ProcessResult(result);
});
注意:WCF 代理的创建成本很高,因此您通常希望尽可能长时间地保持它们的事件状态,而不是每隔几秒(或更长时间)创建和处理它们。这适用于不经常使用的客户端。
关于c# - WCF:使用分部类覆盖客户端的 Dispose 方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603788/