【问题标题】:WCF: Is it safe to override the Client's Dispose method using a partial class?WCF:使用部分类覆盖客户端的 Dispose 方法是否安全?
【发布时间】:2010-04-09 06:51:22
【问题描述】:

我想覆盖生成的代理 (ClientBase) 的 Dispose 方法,因为处理代理调用 Close 并且在通道发生故障时可能引发异常。

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

 public partial class MyServiceProxy : IDisposable
    {
        #region IDisposable Members

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

        #endregion
    }

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

你觉得这个策略有什么问题吗?

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

如果我能够让我的代理从基类继承,那就太好了……

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

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

    至于必须为每个 WCF 客户端重新实现此代码 - 不幸的是,是的,如果您想对这些使用 IDisposable 模式,您将这样做。您可以将if/else 块提取到实用程序方法中,但您仍然必须为每个部分创建一个部分类并覆盖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 代理的创建成本很高,因此您通常希望尽量让它们保持活动状态,而不是每隔几秒(或更长时间)创建和释放它们。这适用于不经常使用的客户端。

    【讨论】:

    • 我喜欢你的版本,这样我就不需要为每个代理创建一个类。谢谢!
    【解决方案2】:

    重写 Dispose() 方法是一种完全有效的策略。

    这个问题的答案还有其他几个选项:What is the best workaround for the WCF client `using` block issue?

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 2017-02-17
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多