是否可以通过 Soap 将我自己开发的异常发送到使用 http.sys 的客户端?
3 回答
不幸的是,据我所知,答案是否定的。您不能在服务器端构建自己的自定义异常并期望通过 WSE 在客户端使用它们。我不能提供太多技术背景来解释原因(比如为什么 WSE 不允许这样做),但我确信我的答案,因为我对此进行了测试。
您可以使用提供的链接中描述的方法返回从 System.Web.Services.Protocols.SoapException 继承的自定义异常,但是您必须在客户端将异常捕获为 SoapException,因为您将无法捕获它作为自定义异常类型:http: //msdn.microsoft.com/en-us/library/ms229064.aspx
要重新创建测试以供您自己确认,请执行以下操作:
- 创建一个测试异常类,随意调用它,并确保它遵循我上面提供的链接中描述的模式(提供了代码示例)。
创建一个显式返回测试异常的 Web 方法,如下所示:
'This is in VB.Net <WebMethod()> _ Public Function ThrowTestSoapException() As TestSoapException Return New TestSoapException() End Function
尝试重新生成客户端的 WSE 库(使用 WseWsdl3.exe),您应该会收到类似这样的错误消息:“错误:服务器不可用,请稍后再试”
这是我在尝试创建自己的可转移自定义异常时所能得到的。同样,我唯一能做的就是返回一个继承自 SoapException 类的自定义异常,并在客户端将其作为 SoapException 捕获。这与上面“CheGueVerra”指出的链接中描述的方法相同。
回应 John Saunders 的上述评论:是的,如果可能的话,转到 WCF,WSE 确实已经过时了。由于这与我和其他提出这些问题的人有关,因此从 WSE 转变为 WCF 需要管理层的批准——所以我们中的一些人不能轻易地做出这些改变——即使我们非常想这样做。
是的,您可以抛出自己的异常。任何不是从 SoapException 派生的未捕获异常都将被 .NET 框架限制为 SoapException。如果您想控制 SoapException 的某些部分是如何形成的(例如,故障和细节部分),您可以从 SoapException 派生。
与它所基于的 ASMX 服务一样,WSE 几乎不支持 SOAP 故障。您可以返回它们(设置了 Detail 属性的 SoapException),但它们不会出现在 WSDL 中。如果由 WSE 客户端接收,它们将显示为 SoapException,而不是自定义异常类型。
WCF 确实完全支持客户端和服务器端的 SOAP 错误。