处理通过接口实例化的 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 客户端 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

WCF通信简单学习实例

处理进入故障状态的持久 WCF 客户端

WCF系列教程之WCF客户端异常处理

WCF自定义错误处理(IErrorHandler接口的用法)

WCF心跳判断服务端及客户端是否掉线并实现重连接

Java Web 服务的 .NET 客户端 WCF 代理类中的类定义重复