生成的服务引用会抛出什么exception?

我使用“添加服务引用…”在Visual Studio 2010中添加了一个Web服务。 这会在名为Reference.cs的文件中生成一些代码。 现在,如果我调用其中一种方法,我就不知道该方法可能抛出的exception。 据推测,它可以抛出网络相关的exception,如SocketExceptionIOException

可以在msdn或源代码内部检查.NET中的常规方法,以揭示可能抛出的exception,例如File.Open 。 这里很清楚我应该捕获哪些exception并重新抛出以在稍后阶段显示错误消息。

对于那些生成的方法,我怎么知道它们可能抛出的exception?

嗯,在这种情况下有“标准”例外,以及“自定义”例外(由服务开发人员定义为FaultContact并出现在服务合同参考中)。

在第一种情况下,我认为你的担忧是CommunicationExceptionTimeoutException ; 这些是ICommunicationObject.BeginOpenICommunicationObject.BeginOpen其他“开放”方法( 模型的基础 )的可能例外。 对于“关闭”方法,记录了CommunicationObjectFaultedException 。 发送消息的方法也有QuotaExceededException ,例如IRequestChannel.Request 。 在可能的更多内容中 ,这些应该是可以发现的。

值得注意的是,从上面链接的MSDN文章中可以看出:

通道抛出的所有exception必须是System.TimeoutExceptionSystem.ServiceModel.CommunicationException或从CommunicationException派生的类型。 (也可能抛出ObjectDisposedException等exception,但仅表示调用代码滥用了通道。如果正确使用了通道,则必须抛出给定的exception。)

然后是“故障”,这是在服务端引发的exception,并且(可能,如果启用)详细给调用者,调用者可以处理它或抛出正确的客户端exception:

生成错误时,自定义通道不应直接发送错误,而是应抛出exception并让上面的层决定是否将该exception转换为错误以及如何发送它。

渠道State提供了一个Faulted事件,您可以订阅该事件,以便在达到此类状态时获得通知,并可能采取行动。 默认情况下(不配置抑制(?)),故障将作为托管exception引发; 再次重申:

在WCF客户端中,客户端应用程序感兴趣的通信期间发生的SOAP错误将作为托管exception引发。 虽然在执行任何程序期间可能会发生许多exception,但使用WCF客户端编程模型的应用程序可能会因通信而处理两种类型的exception。

这再次引用了上面提到的CommunicationExceptionTimeoutException

最后,至少现在是出乎意料的:

当侦听器收到操作协定中未预期或指定的错误时,抛出FaultExceptionexception; 通常,在调试应用程序并且服务将System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults属性设置为true时会发生这种情况。