【问题标题】:Dispose a Web Service Proxy class?处置 Web 服务代理类?
【发布时间】:2011-02-18 21:40:52
【问题描述】:

当您在 ASP.Net 框架中创建和使用 Web Service 代理类时,该类最终继承自实现 IDisposable 的 Component。

我从未在网上看到过人们处理 Web 代理类的示例,但我想知道是否真的需要这样做。当我只调用一个方法时,我通常将它包装在 using 语句中,但如果我需要在整个页面中多次调用它,我可能最终会使用同一个实例,只是想知道不处理的后果是什么它。

【问题讨论】:

    标签: c# asp.net web-services


    【解决方案1】:

    您需要处置实现IDisposable所有内容

    IDisposable 的实现表示该对象持有 某些 垃圾收集器本质上不会跟踪的东西 - 可能是一个连接,可能是一个文件,可能是其他一些句柄 - 或可能什么都不是,这并不重要。您不必关心实施细节,因为这些可能会发生变化。

    该类可能会或可能不会真正使用非托管资源。它可能有也可能没有终结器。差别不大;如果该类实现了IDisposable,那么当你完成时它会要求你Dispose。即使Dispose 方法什么都不做,你永远不知道什么时候有人会将对该类的引用替换为对确实确实需要处理的子类的引用。

    【讨论】:

      【解决方案2】:

      简短的回答是,对于 Web 服务代理类,您应该关闭它们而不是处置它们。

      几乎在所有情况下,您都应该处理实现 IDisposable 的东西。但是,Web 服务代理类是一种特殊情况。对于这些类以及从System.ServiceModel.ClientBase 继承的所有类,最佳实践调用 dispose 而是直接调用 Close 方法。

      使用反射器可以看到ClientBaseDispose方法只是调用了Close。所以如果没有例外,DisposeClose 会做同样的事情。但是如果有异常,就会有不同的行为。

      因为Close方法会抛出异常,所以你应该直接调用它并捕获它的异常。如果你调用Dispose方法,你也应该捕获异常,但是你的代码会更难理解。

      这也意味着您应该避免将代理声明放在using 语句中。在这种情况下,如果在using 块中抛出异常,它将被遮挡。由using 块自动生成的Dispose 调用将被调用,因为它位于finally 块中。从Dispose 中的Close 抛出的异常将掩盖之前抛出的任何异常。

      要查看更详细的说明,请阅读MSDNCoding Up StyleBlogginAbout.NetStackOverflow 上的这些文章。

      有关为什么以这种方式实现的背景故事,请查看MSDN forums 上的此线程。

      【讨论】:

      • 请注意,这些链接特定于 WCF 服务引用,而不是 .NET 2.0 Web 引用。创建代理的方式会有所不同。
      【解决方案3】:

      有时 Dispose() 只是一个虚拟对象(继承自基类),但调用它仍然是一个好习惯,以确保未来更改的安全。

      WebService/WCF 代理正在保持连接,因此调用 Dispose() 或 Close() 无疑是个好主意。在 using 块中这样做当然是更可取的,因为它是异常安全的。

      但在您的情况下(在页面上的多个方法中使用代理)使用多个 using 块可能会影响性能。在页面周期后期出现的事件中,可以使用调用 Close() 替换 using 块。我不确定这里的 ASP.NET 最佳实践,但我会使用 OnPreRender 或 OnPageUnload 之类的。

      您将在这里失去异常安全性,但这不是一个基本问题,GC 会解决这个问题。

      【讨论】:

        【解决方案4】:

        恕我直言,没有什么比配置 Web 服务代理类更好的了。

        大多数代理是:

        • 无状态,因此使用一个实例或使用多个实例进行调用没有任何区别
        • 间歇性意味着他们在处理完所有响应后立即关闭连接

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多