【发布时间】:2010-09-21 15:17:40
【问题描述】:
快速的问题,但是将服务代理类包装在 using 语句中是最佳实践吗?这意味着,在 VS 中,我们为 WCF 服务生成了一个代理。对于服务类,是否应该包装在使用中?我不相信它实现了 IDisposable 并且没有 Dispose() 方法。谢谢。
【问题讨论】:
标签: asp.net wcf web-services
快速的问题,但是将服务代理类包装在 using 语句中是最佳实践吗?这意味着,在 VS 中,我们为 WCF 服务生成了一个代理。对于服务类,是否应该包装在使用中?我不相信它实现了 IDisposable 并且没有 Dispose() 方法。谢谢。
【问题讨论】:
标签: asp.net wcf web-services
虽然服务参考和 svcutil.exe 生成的代理 做 实现了 IDisposable,但通常不是将它们包装在 using 块中的最佳做法;而是支持显式打开和关闭。
为什么?好吧,问题在于Dispose 方法调用Close,它可以在各种情况下抛出,尤其是在通道处于故障状态时。一般来说,这很糟糕,但如果在 finally 块期间发生这种情况,因为您让错误异常冒泡,它可能会吞下原始错误异常以支持Close 异常,从而有效地丢失原始异常。
【讨论】:
using 块,除了我提到的问题之外,这不是一个坏习惯。但是,当您不使用它时,无论是显式还是隐式,您都应该始终关闭它。另一方面,显式打开通道并不总是必要的,因为代理上的第一个操作调用将始终打开通道。