WCF:ServiceClient + Dispose

时间:2011-02-21 20:57:36

标签: wcf

这就是我理解为什么我们需要为serviceClients实现自己的包装类(如果我错了请纠正我):

  

捕获异常的目的   在Dispose()方法中就是这样   .Close()可以抛出一个   “CommunicationException”或   “TimeoutException” - 并防止   连接挂你抓住那些   两个例外使用.Abort()当中   将改变的状态   通信对象关闭   immediatley。 - 它不会做任何   让异常成为一种感觉   未处理,因为nessecary调用   已经制定了方法   因为我们在Dispose()部分,而且   因此扔一个是奇怪的   工作实际上是异常   按原样完成。

但为什么:

public class ServiceClientWrapper<TServiceType> : IDisposable
{
    public TServiceType Channel { get; private set; }
    private readonly ChannelFactory<TServiceType> _channelFactory;

    public ServiceClientWrapper(string endpoint)
    {
        _channelFactory = new ChannelFactory<TServiceType>(endpoint);
        Channel = _channelFactory.CreateChannel();
        ((IChannel)Channel).Open();
    }

    #region Implementation of IDisposable

    public void Dispose()
    {
        try
        {
            ((IChannel)Channel).Close();
        }
        catch (CommunicationException ex)
        {
            ((IChannel)Channel).Abort();
        }
        catch (TimeoutException ex)
        {
            ((IChannel)Channel).Abort();
        }
        catch (Exception)
        {
            ((IChannel)Channel).Abort();
            throw;
        }
    }

    #endregion
}

当你能做到:

public class ServiceClientWrapper<TServiceType> : IDisposable
{
    public TServiceType Channel { get; private set; }
    private readonly ChannelFactory<TServiceType> _channelFactory;

    public ServiceClientWrapper(string endpoint)
    {
        _channelFactory = new ChannelFactory<TServiceType>(endpoint);
        Channel = _channelFactory.CreateChannel();
        ((IChannel)Channel).Open();
    }

    #region Implementation of IDisposable

    public void Dispose()
    {
        ((IChannel)Channel).Abort();
    }

    #endregion
}

根据MSDN,.Close().Abort()都会将通讯对象的状态更改为“已关闭”?

2 个答案:

答案 0 :(得分:3)

关键是Close()的目标是优雅地关闭整个通信通道,包括通信协议所需的任何结束握手,而Abort()是客户端通道堆栈的粗鲁和残酷的拆分,没有试图将关闭正确地传达给另一方。因此,中止可能会使服务器端资源仍然依赖于不会进一步使用的连接。

所以我们总是希望尽可能执行Close,但是我们需要处理事情如此破碎以至于尝试执行Close会导致进一步异常的情况。

答案 1 :(得分:2)

关闭方法:

http://msdn.microsoft.com/en-us/library/ms405496.aspx

此方法使CommunicationObject从除Closed状态以外的任何状态正常转换为Closed状态。 Close方法允许在返回之前完成任何未完成的工作。例如,完成发送任何缓冲的消息。

中止方法 不一样或不符合规格中的规定。它不会完成任何仍在继续...