我如何关闭wcf客户端

时间:2011-06-29 14:06:53

标签: c# wcf

在我的业务层中,我正在使用WCF服务。 WCF服务实例也可以在构造函数中传递。以下是我的BL的构造函数。

    private IWCFClient wcfClient;

    public MyBL()
        :this(new WCFClient())
    {

    }

    public MyBL(IWCFClient wcfClient)
    {
        serviceClient = wcfClient;
    }

因为我将wcfClient声明为接口,所以我没有得到.Close()方法。我必须将其类型化为((RealwCFClient)wcfClient).Close();

有没有办法可以关闭我的客户而不进行类型转换?我应该在界面中公开Close方法吗?

5 个答案:

答案 0 :(得分:3)

将您的对象投射到ICommunicationObject然后.Close()它。

请注意,Close()可以抛出异常,在这种情况下捕获它并执行.Abort()

答案 1 :(得分:1)

除了其他答案,您还应该考虑creating a reusable WCF service client。在这个可重用的客户端中,您可以处理打开和关闭,而不是让消费类担心它。

答案 2 :(得分:1)

您可以为您的类实现IDisposable,并在您的Dispose方法中关闭WCF服务实例。

public class Consumer
{
    public void SomeMethod()
    {
        using (WCFClient client = new WCFClient(new WCFService()))
        {
            int sum = client.Add(5, 10);
        }
    }
}

public class WCFClient : IDisposable
{
    private WCFService _service;

    public WCFClient(WCFService service)
    {
        _service = service;
    }

    public int Add(int a, int b)
    {
        return _service.Add(a, b);
    }

    public void Dispose()
    {
        if (_service != null)
            _service.Close();
    }
}

Consumer的SomeMethod()方法中的using块将确保调用WCFClient的dispose方法来关闭与服务的连接。

答案 3 :(得分:1)

这是一个链接 MSDN doc concerning closing a client

一般来说,dispose / close不会抛出异常我使用了一个包含这个功能的扩展方法,这里是一个非常好的 article providing the basic concept

我喜欢使用或执行方法名称而不是使用动词,因为使用具有调用dispose的含义,大多数人都不希望例外。

答案 4 :(得分:0)

只要IWCFClient的所有具体实施者都有Close()方法,然后将Close()方法添加到界面。