【问题标题】:How can BizTalk 2006 R2 consume the serialized response of a WCF service with PreserveObjectReferences = true?BizTalk 2006 R2 如何使用 PreserveObjectReferences = true 的 WCF 服务的序列化响应?
【发布时间】:2009-08-10 00:51:01
【问题描述】:

我们有一个现有的 .net 3.5 WCF 服务,其中 PreserveObjectReferences 在服务器端设置为 true。

当 PreserveObjectReferences 设置为 false 时,BizTalk 可以使用响应。

有没有办法让 BizTalk 使用 PreserveObjectReferences 响应负载...

PreserveObjectReferences 以 z:id 出现在对象的第一个实例和 z:ref 出现在任何后续对象出现:

<b:xyz *z:Id="5"* i:type="abc">...</b:xyz>
...
<b:xyz *z:ref="5"* />

【问题讨论】:

  • 然后会发生什么?出了什么问题?毕竟,它是有效的 xml(尽管不仅仅是标准的“树”)。那么什么破呢?

标签: c# .net wcf serialization biztalk


【解决方案1】:

生成 xsd 时配置的 PreserveObjectReferences 选项是什么?

xsd 是从 WCF 服务生成的,它是 WSDL,如果在此 WSDL 中未定义这些额外属性,BizTalk 将不知道它们存在,并且 BizTalk 将引发异常。我不确定 DataContractSerializer 在生成 WSDL 时是否会包含这些属性。如果 DataContractSerializer 在生成 WSDL 时不包含这些属性,您必须更改响应消息的 xsd 以允许添加这些属性的元素上的 xs:any 属性。

【讨论】:

  • 谢谢 Rob,当我们再次查看它时,我们会试一试。
【解决方案2】:

由于不同的原因,BizTalk 和 JAX-B 在处理有效负载方面存在问题。 ID/IDREF 是受支持的 XML Schema 选项,但每个实现似乎都存在使用它们的问题。

对于 JAX-B,当同时指定 idref 和 nil=true 时,它​​无法将有效负载编组为对象:

<b:xyz z:ref="5" nil="true"  />

删除 nil=true 或将保留对象引用设置为 false(即不使用 idref 功能返回有效负载意味着 Java 编码人员可以解决此问题。

BizTalk 可以通过 xslt 转换或其他方式在没有 idref 支持的情况下重新处理 xml 来解决此问题。

我们的解决方案是确保关闭保留对象引用。然后,两个系统都能够轻松集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多