1

我是 web 服务的新手,我面临一个设计问题,我们想要创建一个 web 服务(最好是基于 SOAP),它将接收 2 个参数:

  • 字符串变量(客户端名称);
  • XML 数据。

目前此 Web 服务有 2 个不同的消费者,但他们的数量将会增加。所有消费者都有将要发送的单独 XSD 数据,例如:

消费者1:

<ConData>
    <Customer>
        <FirstName>FirName</FirstName>
        <LastName>LasName</LastName>
    </Customer>
    <Acocunt>
        <Number>112971</Number>
    </Account>
    <Order>
        <OrderNum>0092123</OrderNum>
    </Order>
<ConData>

消费者2:

<ConData>
    <SysData>
        <CustomerFirstName>Name</CustomerFirstName>
        <CustomerLastName>Name</CustomerLastName>
        <AccountNumber>Au1o2n</AccountNumber>
        <OrderNum>koo912</OrderNum>
    </SysData>
<ConData>

该 Web 服务应该从这些客户端获取 XML 数据,并根据消费者名称将其存储到数据库中。我们不需要进行任何处理来验证 XML,我们只需将其存储在数据库中即可。

不过,作为一个好的设计,我想用显式参数定义我的 Web 服务。问题是,由于它们的 XML 数据格式不同,我无法在我的 WSDL 中使用单个 XSD 模式作为参数。我可以想到 2 个选项来解决这个问题:

1. 让他们在我的 Web 服务中将 XML 数据作为字符串而不是 XSD 映射参数传递。虽然这是一种有效的方法,但根据我目前在论坛上所读到的内容,这似乎是一个糟糕的设计,因为它使验证无效,并且需要大量的手动编组和解组以及其他问题。另外,我的 WSDL 将无法向我的客户定义预期的格式等。

2. 创建 2 个单独的 Web 服务,它们将使用自己的 XSD 处理不同的个人消费者。这似乎不太可行,因为将来如果我们添加更多消费者,我们将不得不为相同的操作添加具有重复代码的新 Web 服务等。

我正在寻找是否有一种方法可以在单个 Web 服务 WSDL 中定义多个 XSD,或者可能是解决此问题的更好方法。

附带说明一下,我更喜欢使用基于 SOAP 的 Web 服务,但如果使用 RESTful Web 服务以更好的方式解决了这个问题,那么我也可以考虑这一点。

4

1 回答 1

2

您不需要为每个客户端提供不同的 Web 服务或框架,您只需要不同的 WSDL 即可

忘记将这个 XML 参数作为字符串发送,它有一些缺点,我不会在这里重复,因为您也已经阅读过它。因此,您需要将其作为 XML 发送。

要将其保留在一个 Web 服务中,您需要创建 Web 服务,以便它接受任何 XML 作为输入(<xsd:any>参数的类型)。类型<xsd:any>将意味着任何类型的 XML,但对于初学者来说,至少是可以验证结构的 XML。

这简化了 Web 服务的版本控制,因为您在添加另一种 XML 类型的输入时不需要更改代码,但不幸的是,您的 Web 服务失去了强类型,并且为 Web 服务生成的 WSDL 不会说明任何有关结构的信息它所期望的 XML(任何 XML 都太模糊了)。您的 Web 服务框架将在您的代码中使用 、Object或其他类型创建。您的所有客户端存根也会发生同样的情况。XmlElementXmlDocument

但是对于您的客户,这可以通过为每个客户提供不同的 WSDL 来从 WSDL 中解决。

为此,您创建一个 Web 服务的 WSDL,其中包含除该<types>部分之外的所有客户端的公共内容,然后将每个客户端的这个公共 WSDL 与它们自己的 XML Schema 合并。然后,您将在每个客户端的不同 URL 上公开每个 WSDL。

现在,客户将能够基于他们自己的特定 WSDL 生成强类型存根。

当客户端调用您的 Web 服务时,您可以识别客户端 XML Schema 并使用它来验证 XML 参数并查看它是否是预期的内容。

如果以上内容看起来很多,那么您总是可以选择松散类型的 RESTful Web 服务。不管您选择什么解决方案,只要确保您使用发送它的客户端的模式来验证传入的 XML。

于 2012-09-02T16:12:06.990 回答