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 的“丢失”信息的主要内容,如果未能解决你的问题,请参考以下文章

从 XSD 文件生成 WSDL

编写 jax-ws web 服务并在没有 XSD 的情况下生成 WSDL

使用PIP扩展BTARN

使用PIP扩展BTARN

XSD 第一个合约 - WCF Soap Web 服务

BizTalk 映射器不显示驻留在其他程序集中的外部数据结构类型的元素