c# - WCF:使用分部类覆盖客户端的 Dispose 方法是否安全?

标签 c# .net wcf

我想重写生成的代理 (ClientBase) 的 Dispose 方法,因为处理代理会调用 Close 并在 channel 出现故障时抛出异常。

我想到的唯一方法是为我生成的代理创建一个部分类,使其继承自 IDisposable:

 public partial class MyServiceProxy : IDisposable
    {
        #region IDisposable Members

        public void Dispose()
        {
            if (State != System.ServiceModel.CommunicationState.Faulted)
                Close();
            else
                Abort();
        }

        #endregion
    }

我做了一些测试,我的 Dispose 方法确实被调用了。

您认为此策略有任何问题吗?

此外,我不喜欢必须为每个生成的代理创建这个部分类的事实。

如果我能够让我的代理从基类继承就好了...

最佳答案

没有问题。以这种方式自定义设计器生成的代码正是部分类旨在提供的功能,这是处理 ClientBase 上损坏的 IDisposable 实现的推荐方法之一>.

至于必须为每个 WCF 客户端重新实现此代码 - 不幸的是,是的,如果你想对这些客户端使用 IDisposable 模式,你会的。您可以将 if/else block 提取到实用程序方法中,但您仍然必须为每个 block 创建一个分部类并覆盖 Dispose

鉴于上面的操作相当繁琐,许多人选择使用 Service Proxy Helper相反,因为它不需要编写任何新代码。

我自己使用了一个稍微修改过的版本:

public static class Service<TProxy>
    where TProxy : ICommunicationObject, IDisposable, new()
{
    public static void Using(Action<TProxy> action)
    {
        TProxy proxy = new TProxy();
        bool success = false;
        try
        {
            action(proxy);
            proxy.Close();
            success = true;
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }
    }
}

允许编写这种代码:

Service<MyServiceClient>.Using(svc => svc.PerformOperation());

或者:

Service<MyServiceClient>.Using(svc =>
{
    var result = svc.PerformOperation();
    ProcessResult(result);
});

注意:WCF 代理的创建成本很高,因此您通常希望尽可能长时间地保持它们的事件状态,而不是每隔几秒(或更长时间)创建和处理它们。这适用于不经常使用的客户端。

关于c# - WCF:使用分部类覆盖客户端的 Dispose 方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603788/

相关文章:

c# - 在 SQL 中将 LIKE '%' 与整数一起使用

javascript - 如何获取用户并将其附加到评论中,然后使用 JavaScript 发送结果以查看?

c# - 没有主键的 NHibernate 字典映射

c# - RestSharp 在上传时将整个文件加载到内存中。如何避免?

C# WCF 客户端需要很长时间才能打开状态 (DuplexClientBase<T>.Open())

c# - 在哪里可以找到全局 IATA 城市列表?

c# - foreach 在循环函数结果时如何工作?

c# - 使用 WCF 回调时,客户端如何知道服务器是否已中断

c# - 服务引用复杂类型

c# - 当新版本已签名但以前未签名时,.NET 程序集绑定(bind)重定向