6

我正在使用 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?

4

2 回答 2

1

除非您在 BizTalk 管道中进行架构验证,否则限制和 maxoccurs > 1 实际上不会做任何事情 - BizTalk 在运行时不会使用它们。我猜这就是网络参考有损的原因。

我个人从不喜欢“添加 Web 引用”功能,甚至不喜欢“添加适配器元数据”/WCF。如果您的 wsdl 经常更改,那么手动将类型定义复制到 xsd 文件中的工作量太大:

a) 查看构建一个简单的控制台应用程序来检索 wsdl、提取类型并更新 xsd 文件(从 VS 的外部工具菜单中启动它),以及

b) 找出需要经常更改服务合同的开发过程出了什么问题!

于 2010-07-06T12:30:52.623 回答
0

您是否尝试过使用 WCF 适配器而不是“添加 Web 引用”来完成这项工作?

这是一个例子......

http://blogs.digitaldeposit.net/SARAVANA/post/2007/05/31/BizTalk-2006-R2-consume-an-ASMX-webservice-using-WCF-BasicHttp-adapter.aspx

于 2010-06-29T18:48:45.217 回答