配置Web服务代理类?

Mat*_*att 6 c# asp.net web-services

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

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

Aar*_*ght 8

你需要处理所有实现的东西IDisposable.

的实施IDisposable表示该对象保存到一些垃圾收集器本质上并不轨道-可能是一个连接,可能是一个文件,可能是一些其他的手柄-或者可能是什么都没有,这其实并不重要.您不应该关注实现细节,因为这些细节可能会发生变化.

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


epo*_*ter 6

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

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

使用反射器,你可以看到简单调用的Dispose方法.所以如果没有例外,并且会做同样的事情.但是,如果存在异常,则会有不同的行为.ClientBaseCloseDisposeClose

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

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

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

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