处理通过接口实例化的 WCF 客户端 [重复]
Posted
技术标签:
【中文标题】处理通过接口实例化的 WCF 客户端 [重复]【英文标题】:Disposing of a WCF client instantiated via an interface [duplicate] 【发布时间】:2015-03-11 12:30:37 【问题描述】:我想澄清以下问题(如果这是一个愚蠢的问题,请提前道歉)
正在处理一些调用 WCF 服务的现有代码。
此代码通过接口实例化 WCF 服务客户端并执行它所需的操作,即:
IWCFService proxyClient = new WCFServiceClient()
但是,我在这里尝试做的是确保连接正常关闭,即:proxyClient.Close()
等,但我无法访问这些,因为它是通过接口创建的(它只包含操作,即:DoSomething()
)
如果我实例化为 WCF 服务客户端(而不是通过接口),我将能够访问可以在 trycatch 块中使用的 Close() 和 Abort 调用。 即:
WCFServiceClient proxyClient = new WCFServiceClient()
//do some stuff..
proxyClient.Close()
将 Close() 和 Abort() 添加到接口定义中,然后在代码中调用它们,从而实现这些的 WCF 实现,这是一个简单的案例吗?
【问题讨论】:
Dispose 调用 Close 内部。只需将代理放在using
块中
@PanagiotisKanavos 仅当通信失败时调用Close
抛出异常并且必须使用Abort
。
对于 WCF 客户端来说,使用 using() 语句不是好的做法,因为它们可以在 Close() 操作中返回异常
是的,我在注意到 OP 正试图优雅地关闭之前发表了评论。
【参考方案1】:
我最近写了一篇关于正确处理 WCF 客户端生命周期的文章:仅将实例化包装在 using
块中是不够的……
看看http://blog.rsuter.com/?p=975
总结:通过using
关键字重载Dispose
如下方式使用客户端:
public void Dispose()
if (isDisposed)
return;
try
if (service.State == CommunicationState.Faulted)
service.Abort();
else
try
service.Close();
catch (Exception closeException)
try
service.Abort();
catch (Exception abortException)
throw new AggregateException(closeException, abortException);
throw;
finally
isDisposed = true;
【讨论】:
虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。 我理解上述逻辑 - 但是服务客户端是通过接口实例化的(由公开几个业务操作的团队之一编写)并且无权访问 .Close() 和.Abort() 函数。以正常方式实例化它是否更好,以便我可以访问这些方法?即:WCFClientProxy clientProxy = new WCFClientProxy() 需要检查Dispose
是否正确实现(只调用Close
是不够的);如何实例化代理对象由您决定
对 - 我可以看到 Dispose 是在 WCF 服务本身上实现的(将一些对象设置为 NULL),我的理解是正确的,在服务器端 WCF 在完成请求时会自动调用它?
客户端和服务端实现是两个不同的东西,需要检查双方是否正确实现(上述问题仅适用于客户端)以上是关于处理通过接口实例化的 WCF 客户端 [重复]的主要内容,如果未能解决你的问题,请参考以下文章