【问题标题】:.NET 2.0 Web Services WSDL Fault element being ignored?.NET 2.0 Web 服务 WSDL 故障元素被忽略?
【发布时间】:2009-04-14 13:37:45
【问题描述】:

我有一个 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 服务的用户身上,以处理这些并正确反序列化它。这两种方法似乎都不是处理这个问题的好方法,并添加了额外的问题和代码来解决这个问题。

有什么建议吗?

【问题讨论】:

  • 您使用的是什么类型的客户端?如果是浏览器中的 Silverlight,那么处理 SOAP 错误就存在不足。
  • 客户端是一个 ASP.NET 网站。

标签: c# .net web-services wsdl asmx


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我坚持使用 .NET 2,我确实在 WCF 中知道这一点,并希望有某种方法可以在 .NET 的 SOAP Web 服务中实现 [FaultContract(typeof(YourCustomException))] 2 我忽略了,但看起来不是这样。
  • 看起来处理这个问题的最好方法是遵循“成功布尔、结果和错误属性”的模式。谢谢。
【解决方案2】:

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

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

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

【讨论】:

  • 我已经研究过手写 WSDL,以便其他使用 wsdl:fault 的客户端能够获取这些内容。但它确实让人们使用 .NET 来实现,而不知道发生了什么异常,除非他们自己阅读 WDSL。
  • 了解 ASMX Web 服务不支持 WSDL 中的错误元素很有用。我知道如果我使用 WCF 这不会是一个问题,但我现在不能这样做,所以希望在 .NET 2 中找到一个解决方案,如标题所示。
  • 不,如果你的服务发送了一个正确的错误,通过填写 SoapException 的 Detail 属性,那么即使是 .NET 2.0 客户端也会收到一个带有 Detail 属性的 SoapException。只是不是单独的每个故障都有例外。
  • 是的,我知道有升级的理由,但我不能在这个项目中使用它,这不是我的决定。使用 SoapException 执行此操作需要客户端(如果他们的 .NET 是 WCF 之前的版本)必须弄清楚如何处理返回的详细 XML。从中获取 ExceptionType。这是对的吗?
  • 是的。这是正确的。我建议使用一种 XML 格式来显示异常类型。根据“例外”,我使根元素独一无二。这有帮助。
【解决方案3】:
[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;
}    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2021-01-11
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多