【问题标题】:Biztalk 2013: Setting different namespace on schema elementsBiztalk 2013:在架构元素上设置不同的命名空间
【发布时间】:2016-09-17 13:43:22
【问题描述】:

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

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

我已经弄清楚如何将其他命名空间/模式导入我的架构,但我不知道如何将元素的命名空间更改为默认值。有谁知道怎么做?

例如,架构根必须有一个命名空间"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 请求失败。

提前致谢!

【问题讨论】:

  • 你能提供更多关于为什么你不能自动生成模式的信息吗?为什么你说命名空间和元素名称都是错误的?它们是什么,你期望它们是什么?请提供示例,只有几个字段可以说明这一点?
  • @gruff 是的,只要我回到正确的键盘上,我就会这样做!
  • “由于懒惰的 C# wsdl 生成”?你到底是什么意思? C# wsdl 不是我们在 BizTalk 中的吗?
  • @Johns-305,我刚刚添加了更多细节。我正在尝试联系的端点上谈论的 WSDL 生成 - 我尝试通信的 C#/WCF 项目没有为其元素正确定义的命名空间,因此当从项目生成 WSDL 时,当您尝试在 Biztalk 中使用它时获得的模式都是错误的。通过另一个 C# 应用程序使用它很好,因为它使用相同的功能“找出”正确的 SOAP 结构,但 Biztalk 不这样做。 (反正我是这么解释的)
  • @IStanley 当您通过另一个 C# 应用程序使用端点时,代理类会从 WSDL 中的元数据生成,这与模式向导用于生成模式的信息相同。唯一的区别是在 BizTalk 中,架构布局不像在 C# 项目中那样对您隐藏(抽象)。

标签: namespaces schema biztalk biztalk-2013


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗯。如果我使用架构生成示例 XML 并尝试使用 SOAPUI 发送该请求,由于命名空间问题,我会收到一大堆错误。你是说如果我使用 BizTalk 端口发送请求就不会发生这种情况,因为内部机制将决定默认应用哪些命名空间?
  • 是的,我的建议是不要尝试更改模式向导生成的模式中的命名空间。然后使用 Fiddler 监控发送端口上的 BizTalk WCF 适配器实际通过线路发送的内容。
猜你喜欢
  • 2012-08-01
  • 2022-07-05
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2013-10-16
  • 2020-11-09
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多