BizTalk Web 参考 - 生成的 XSD 具有来自 WSDL 的“丢失”信息
Posted
技术标签:
【中文标题】BizTalk Web 参考 - 生成的 XSD 具有来自 WSDL 的“丢失”信息【英文标题】:BizTalk Web Reference - generated XSD has "lost" information from WSDL 【发布时间】:2011-02-28 15:10:09 【问题描述】:我正在使用 BizTalk 2006 R2 从 WSDL 文件生成 Web 引用。
将生成的 XSD 与 WSDL 进行比较,显然丢失了很多信息。
考虑以下 WSDL 的摘录:
<s:element form="unqualified" minOccurs="0" maxOccurs="4" name="Applicant">
<s:complexType>
<s:sequence>
<s:element form="unqualified" minOccurs="1" maxOccurs="1" name="ApplicantIdentifier">
<s:simpleType>
<s:restriction base="s:string" />
</s:simpleType>
</s:element>
<s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Name">
<s:complexType>
<s:sequence>
<s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Title">
<s:simpleType>
<s:restriction base="s:string">
<s:maxLength value="10" />
</s:restriction>
</s:simpleType>
</s:element>
<s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Forename">
<s:simpleType>
<s:restriction base="s:string">
<s:pattern value="[0-9A-Za-z \-]*" />
<s:maxLength value="15" />
<s:minLength value="1" />
</s:restriction>
</s:simpleType>
</s:element>
<!-- more -->
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
BizTalk 生成的等效 XSD 是:
<xs:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="Applicant">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="ApplicantIdentifier" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Name">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Title" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Forename" type="xs:string" />
<!-- more -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
因此,XSD 失去了限制模式,并为 minOccurs 和 maxOccurs 设置了自己的值。
我需要从另一个源映射到 XSD,并且我希望在那个阶段捕获不符合 WSDL 的数据。
有人知道为什么 BizTalk 没有保留 XSD 中的限制吗?或者如何生成无损 XSD?
【问题讨论】:
使用 Xsd.exe 是否产生相同的结果? 谢谢你的建议,TEEKAY。当我将 xsd.exe 指向 WSDL 文件时: xsd.exe "C:\Demos\MyProblem.wsdl" /o:"C:\Demos" 我收到错误“错误:无效的命令行参数:'C:\Demos \MyProblem.wsdl'" 然后我更改了文件扩展名以试图欺骗 xsd.exe: xsd.exe "C:\Demos\MyProblem.xsd" /o:"C:\Demos" 我得到了错误:“错误:只能生成类或数据集之一。”无论如何感谢您的建议。 【参考方案1】:您是否尝试过使用 WCF 适配器而不是“添加 Web 引用”来完成这项工作?
这是一个例子......
http://blogs.digitaldeposit.net/SARAVANA/post/2007/05/31/BizTalk-2006-R2-consume-an-ASMX-webservice-using-WCF-BasicHttp-adapter.aspx
【讨论】:
【参考方案2】:除非您在 BizTalk 管道中进行架构验证,否则限制和 maxoccurs > 1 实际上不会做任何事情 - BizTalk 在运行时不会使用它们。我猜这就是网络参考有损的原因。
我个人从不喜欢“添加网络引用”功能,甚至不喜欢“添加适配器元数据”/WCF。如果您的 wsdl 频繁更改,那么手动将类型定义复制到 xsd 文件中的工作量太大:
a) 着眼于构建一个简单的控制台应用程序来检索 wsdl、提取类型并更新 xsd 文件(从 VS 中的外部工具菜单启动它),以及
b) 找出需要经常更改服务合同的开发过程出了什么问题!
【讨论】:
以上是关于BizTalk Web 参考 - 生成的 XSD 具有来自 WSDL 的“丢失”信息的主要内容,如果未能解决你的问题,请参考以下文章