配置Web服务代理类?

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

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

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

IDisposable的实现表明该对象持有垃圾收集器本身没有跟踪的东西 – 可能是一个连接,可能是一个文件,可能是其他一些句柄 – 或者可能根本没有任何东西,它并不重要。 您不应该关注实现细节,因为这些细节可能会发生变化。

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

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

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

使用reflection器,您可以看到ClientBaseDispose方法只是调用Close 。 因此,如果没有例外, DisposeClose将执行相同的操作。 但是,如果存在exception,则会有不同的行为。

因为Close方法可以抛出exception,所以应该直接调用它并捕获它的exception。 如果您调用Dispose方法,您还应该捕获exception,但您的代码将更难理解。

这也意味着您应该避免将代理声明放在using语句中。 在这种情况下,如果在using块中抛出exception,它将被遮挡。 将usingusing块自动生成的Dispose调用,因为它位于finally块中。 从DisposeClose抛出的exception将模糊先前抛出的exception。

要查看更详细的说明,请阅读MSDN , Coding Up Style , BlogginAbout.Net和StackOverflow上的这些文章。

有关为何以这种方式实现它的背景故事,请查看MSDN论坛上的此主题。

有时Dispose()只是一个虚拟(从基类inheritance),但是调用它仍然是一个很好的做法,对于将来的更改是安全的。

WebService / WCF代理正在保持连接,因此调用Dispose()或Close()当然是个好主意。 在使用块内部这样做当然是优选的,因为它是exception安全的。

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

你会在这里放松exception安全,但这不是一个根本问题,GC会解决这个问题。

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

大多数代理是:

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