处理通过接口实例化的 WCF 客户端

Disposing of a WCF client instantiated via an interface

我想澄清以下问题(如果这是一个愚蠢的问题,请提前致歉)

正在处理一些调用 WCF 服务的现有代码。

此代码通过接口实例化 WCF 服务客户端并执行其所需的操作,即:

IWCFService proxyClient = new WCFServiceClient()

然而,我在这里尝试做的是确保连接正常关闭,即:proxyClient.Close() 等,但我无法访问这些,因为它是通过接口创建的(它只包含操作,即:DoSomething())

如果我实例化为 WCF 服务客户端(而不是通过接口),我将能够访问我可以在 try{}catch{} 块中使用的 Close() 和 Abort 调用。 即:

WCFServiceClient proxyClient = new WCFServiceClient()
 //do some stuff..
proxyClient.Close()

将 Close() 和 Abort() 添加到接口定义,然后在代码中调用它们是否是一个简单的例子,代码又应该实现这些的 WCF 实现?

我最近写了一篇关于正确处理 WCF 客户端生命周期的文章:仅将实例化包装在 using 块中是不够的...

看看http://blog.rsuter.com/?p=975

总结:重载Dispose以下方式使用带有using关键字的客户端:

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;
    }
}