Biztalk 2013:在架构元素上设置不同的命名空间

Biztalk 2013: Setting different namespace on schema elements

我正在开发一个 BizTalk 应用程序来查询由第三方编写和维护的大量 Web 服务,但我在获取架构上正确的命名空间时遇到了一些问题。

基本上,我不能使用 wsdl 来自动生成模式,因为在生成的模式中命名空间和元素名称都是错误的(由于 C# wsdl 生成很慢),所以我不得不从头开始编写它们.这很好,但是 Web 服务端点要求架构中的元素都使用特定的命名空间进行限定,并且 none 其中的元素与整个架构的命名空间相匹配。

我已经弄清楚如何将其他 namespaces/schemas 导入到我的架构中,但我不知道如何将元素的名称空间更改为默认名称以外的任何名称。有人知道怎么做吗?

例如,架构根必须具有 "http:/tempuri.org/" 的命名空间,但其中一个元素需要命名空间 "http://schemas.datacontract.org/2004/07/ReadService.DTO.Inbound.Supplier",但在 BizTalk 中,我无法编辑该元素的命名空间元素来改变它。

其中一个请求的正文如下所示:

<tem:GetSupplierIdWithExternalId>
     <tem:request>
        <com:Header>
           <com1:Username></com1:Username>
           <com1:Locale></com1:Locale>
        </com:Header>
        <read:ExternalSupplierId></read:ExternalSupplierId>
     </tem:request>
  </tem:GetSupplierIdWithExternalId>

"tem" 在这种情况下是 http://tempuri.org/”。"com"、"com1" 和 "read" 都是不同的命名空间,正如 Gruff 指出的那样, 都是 WCF 项目的默认命名空间。

在 Biztalk 中从 WSDL 生成会产生 2 个问题:

  1. 应用于根注释的默认命名空间不是 tempuri.org(因为它认为这是默认的),它是标准的 Biztalk http://..Folder.SchemaName命名空间。将其更改为 tempuri.org 会导致一系列必须修复的错误,并且无法解决更主要的问题:

  2. 由于生成 WSDL 的 WCF 函数的编写方式,主要元素名称(上面的GetSupplierIdWithExternalId)都命名不正确 - 在大多数情况下,类似于 "GetSupplierIdWithExternalIdRequest",因为这是生成架构的函数的名称。这又是由于端点上的惰性编程,因为元素的名称没有被正确定义,它只是由生成过程假设的。

如果我尝试创建单个平面文件架构,我只能为整个文件定义一个命名空间,如果我将其设置为 tempuri.org,我会得到:

<ns0:GetSupplierWithExternalId xmlns:ns0="http://tempuri.org/">
  <Header>
    <Username>Username_0</Username>
    <Locale>Locale_0</Locale>
  </Header>
  <ExternalSupplierId>ExternalSupplierId_0</ExternalSupplierId>
</ns0:GetSupplierWithExternalId>

...SOAP 请求失败,因为内部元素的命名空间不正确。

提前致谢!

您需要在其自己的架构文件中定义命名空间为“http://schemas.datacontract.org/2004/07/ReadService.DTO.Inbound.Supplier”的元素,并将其导入架构根并以此方式组合根。该元素将保留其定义的命名空间。

查看命名空间“http://schemas.datacontract.org/2004/07/ReadService.DTO.Inbound.Supplier”,它似乎是 WCF 为数据协定提供的默认命名空间,因为它没有明确定义。 (class 的 CLR 命名空间是 ReadService.DTO.Inbound.Supplier)当 DataContractSerializer 在发送请求时序列化消息时,它将使用该命名空间对其进行序列化。您不应尝试在 BizTalk 架构中更改它,否则将出现架构不匹配。

更新: 在您的更新中,您提到了从 WSDL 生成模式时的 2 个问题。

  1. 你能把这个截图贴上来吗?
  2. 您确定 GetSupplierIdWithExternalIdRequest 是错误的吗?如果您在 WSDL 中搜索该术语,您能找到它吗? 操作的请求和响应包装器通常以 -Request 和 -Response 为后缀,因此这可能是完全正确的。