我正在开发一个BizTalk应用程序来查询由第三方编写和维护的许多Web服务,而我在使用Schema上的命名空间时遇到了一些麻烦。
基本上,我不能使用wsdl来自动生成模式,因为名称空间和元素名称在生成的模式中都是错误的(由于懒惰的C#wsdl生成),所以我不得不从头开始编写它们。这没关系,但是Web服务端点要求模式中的元素都使用特定的命名空间进行限定,并且它们都不匹配整个模式的命名空间。
我已经想出如何将其他命名空间/模式导入到我的模式中,但我无法弄清楚如何将元素的命名空间更改为除默认值之外的任何内容。有谁知道怎么做?
例如,Schema根必须具有"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项目的默认名称空间。 / p>
在Biztalk中从WSDL生成会产生两个问题:
应用于根音符的默认命名空间不是tempuri.org(因为它将此识别为默认名称),它是标准的Biztalk http://..Folder.SchemaName命名空间。将此更改为tempuri.org会导致必须修复的级联错误,并且无法解决更重要的问题:
由于编写了WSDL的WCF函数的编写方式,主要的元素名称(上面的GetSupplierIdWithExternalId
)都被错误地命名 - 在大多数情况下,类似于“GetSupplierIdWithExternalId 请求“,因为这是生成模式的函数的名称。同样,这是由于端点上的延迟编程,因为元素的名称没有被正确定义,它只是由生成过程假设。
如果我尝试创建单个平面文件架构,我只能为整个文件定义一个命名空间,如果我将其设置为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请求失败。
提前致谢!
答案 0 :(得分:2)
您需要定义名称为&#34; http://schemas.datacontract.org/2004/07/ReadService.DTO.Inbound.Supplier&#34;的元素。在它自己的模式文件中,并将其导入到模式根目录并以这种方式组成根。该元素将保留其定义为的命名空间。
查看命名空间&#34; http://schemas.datacontract.org/2004/07/ReadService.DTO.Inbound.Supplier&#34;,它似乎是WCF提供数据合同的默认命名空间,因为它没有明确定义。 (该类的CLR命名空间是ReadService.DTO.Inbound.Supplier)当DataContractSerializer在发送请求时序列化消息时,它将使用该命名空间序列化它。您不应该尝试在BizTalk架构中更改它,否则将出现架构不匹配。
更新: 在您的更新中,您在从WSDL生成模式时提到了2个问题。
GetSupplierIdWithExternalIdRequest
不正确吗?如果您在WSDL中搜索该术语,您能找到它吗?
操作的请求和响应包装器通常以-Request和-Response为后缀,因此这可能完全正确。