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

vid*_*ige 10 c# wcf web-services service-reference

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

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

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

Gra*_*mas 15

嗯,在这种情况下存在"标准"异常,以及"自定义"异常(FaultContact由服务开发人员定义为s并存在于服务合同引用中的异常).

在第一种情况下,我认为你的担忧是CommunicationExceptionTimeoutException; 这些是(模型基础)的ICommunicationObject.BeginOpen其他"开放"方法的可能例外情况.记录了'结束'方法.还有用于发送消息的方法,例如.在可能的更多内容中,这些应该是可以发现的.ICommunicationObjectCommunicationObjectFaultedExceptionQuotaExceededExceptionIRequestChannel.Request

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

由信道引发的所有异常必须是 System.TimeoutException,System.ServiceModel.CommunicationException,或从衍生的CommunicationException类型.(也可能抛出ObjectDisposedException等异常,但仅表示调用代码滥用了通道.如果正确使用了通道,则必须抛出给定的异常.)

然后是'Faults',它是服务端引发的异常,并且(可能,如果已启用)详细给调用者,调用者可以处理它或抛出正确的客户端异常:

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

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

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

这又涉及CommunicationExceptionTimeoutException上面提到的.

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

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