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

C# 处理通过接口实例化的WCF客户端,c#,web-services,wcf,C#,Web Services,Wcf,我想澄清以下内容(如果这是一个愚蠢的问题,请提前道歉) 我正在处理一些调用WCF服务的现有代码 此代码通过接口实例化WCF服务客户端,并执行其需要的操作,即: IWCFService proxyClient = new WCFServiceClient() 然而,我在这里试图做的是确保连接正常关闭,即:proxyClient.Close()等,但我无法访问这些,因为它是通过一个接口创建的(该接口仅包含操作,即:DoSomething()) 如果我实例化为WCF服务客户机(而不是通过接口),我将

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

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

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

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

如果我实例化为WCF服务客户机(而不是通过接口),我将能够访问Close()&Abort调用,我可以在try{}catch{}块中使用这些调用。 i、 e:


这是添加Close()和Abort()的简单情况吗我最近写了一篇关于正确处理WCF客户机生命周期的文章:仅使用
块将实例化包装在
中是不够的

看看

摘要:重载
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;
    }
}

Dispose呼叫在内部关闭。只需使用
block@PanagiotisKanavos只有在通信失败的情况下,才能调用
Close
抛出异常,并且必须使用
Abort
。使用using()语句不是WCF客户端的良好做法,因为它们可以在Close()操作中返回异常,这是真的,在注意到OP试图优雅地关闭之前,我发表了评论。虽然这在理论上可以回答问题,但在这里包括答案的基本部分,并提供链接供参考。我理解上述逻辑-但是服务客户端是通过接口实例化的(由一个团队编写,该团队公开了一些业务操作),并且没有访问.Close()和.Abort()函数的权限。是否最好以正常方式实例化它,以便我可以访问这些方法?例如:WCFClientProxy clientProxy=new WCFClientProxy()。您需要检查
Dispose
是否正确实现(仅调用
Close
是不够的);如何实例化代理objectright取决于您-我可以看到Dispose是在WCF服务本身上实现的(将一些对象设置为NULL),我的理解是对的,在服务器端,WCF在处理请求时会自动调用它吗?客户端和服务器端实现是两件不同的事情,您需要检查双方是否正确实现(提到的问题仅适用于客户端)
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;
    }
}