【发布时间】: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 个问题:
应用于根注释的默认命名空间不是 tempuri.org(因为它认为这是默认命名空间),而是标准 Biztalk http://..Folder.SchemaName 命名空间。将其更改为 tempuri.org 会导致必须修复的级联错误,并且不能解决更主要的问题:
由于生成 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