2

我有一个 Web 服务方法,我想在其中抛出一些自定义异常,例如 SomeException、SomeOtherException 等,然后 Web 服务将变成客户端能够处理的 SOAP 错误。在 Java 中,我可以在 WSDL 的 wsdl:operation 元素中包含 wsdl:fault 元素。.NET 似乎不适合这种情况,并且无法将属性放在 WebMethod 上以显示可能发生的 SOAP 错误。

如果我创建一个具有 wsdl:fault 元素的 Java Web 服务并添加对 .NET 项目的 Web 引用,我会期望 wsdl:fault 元素会导致创建适当命名的异常,就像创建其他实体一样,但是这似乎并非如此。

.NET 是否完全忽略了 WSDL 中的 wsdl:fault 元素?它们是http://www.w3.org/TR/wsdl中定义的 WSDL 规范的一部分,所以这不是我所期望的行为。

如果是这种情况,可能的解决方法可能是返回一个包含成功/失败布尔值和错误消息/枚举的结果对象。或者通过使用 SoapExceptions。如果我选择使用 SoapExceptions,那么我会将重点放在我的 Web 服务的用户上,以处理这些并正确反序列化它。这两种方法似乎都不是处理这个问题的好方法,并添加了额外的问题和代码来解决这个问题。

有什么建议吗?

4

3 回答 3

2

由于您要求.net 2.0,我想您知道这在 WCF 中是“固定的”,您可以在其中添加属性 [FaultContract(typeof(YourCustomException))]。

正如您所说,在 2.0 中完成此操作的“正常”方式是添加一个带有成功布尔值、结果和错误属性的响应消息。

您通常可以在 EntLib 中看到这是如何完成的。

于 2009-04-14T13:43:19.870 回答
2

ASMX Web 服务不支持客户端或服务器上的 wsdl:fault 元素。他们永远不会。

正如ThorHalvor所说,对此的错误修复称为“WCF”。

我已经成功地手写了一个包含 wsdl:fault 元素的 WSDL,然后通过将错误消息作为 SoapException 的 Detail 属性通过 ASMX Web 服务返回了这些错误。然后,Java 和 WCF 客户端正确地将其视为适当类型的异常。

于 2009-04-14T14:03:45.703 回答
2
[return: System.Xml.Serialization.XmlElementAttribute("ResultWS", typeof(ResultWS), Namespace = "http://...")]
[return: System.Xml.Serialization.XmlElementAttribute("ResultFaultWS", typeof(ResultFaultWS), Namespace = "http://...")]
public object SumTest_Operation([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://...")] ParamWS param)
{            
    ResultWS result = null;
    try
    {
        result.Value = param.P1 + param.P2;              

    }
    catch (Exception)
    {
        ResultFaultWS resultFault = new ResultFaultWS();
        resultFault.Status = noOK;

        return resultFault;;
    }
    return result;
}    
于 2016-11-01T17:52:03.447 回答