BizTalk with BTARN:找不到文档规范,因为多个模式匹配消息类型“string”

时间:2015-12-01 23:37:07

标签: c# wcf biztalk biztalk-2013 mscorlib

我们安装了BizTalk 2013,它还安装了BizTalk Accelerator for RosettaNet(BTARN)。我们使用一个业务流程作为WCF服务(使用BizTalk WCF服务向导生成)。业务流程是针对.NET v4.5编译的,就像通过WCF调用业务流程的代码一样。业务流程的传入消息类型是我们定义的模式(也是针对v4.5编译的),其中包含一堆字符串。这是架构的讽刺:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://zzz.Engine.Schemas.RequestCanonical" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://zzz.Engine.Schemas.RequestCanonical" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Request">
    <xs:annotation>
      <xs:appinfo>
        <b:properties>
          <b:property distinguished="true" xpath="/*[local-name()='Request' and namespace-uri()='http://zzz.Engine.Schemas.RequestCanonical']/*[local-name()='Document' and namespace-uri()='']" />
          <b:property distinguished="true" xpath="/*[local-name()='Request' and namespace-uri()='http://zzz.Engine.Schemas.RequestCanonical']/*[local-name()='SenderId' and namespace-uri()='']" />
        </b:properties>
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="Document" type="xs:string" />
        <xs:element minOccurs="1" maxOccurs="1" name="SenderId" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

由于我们已将BTARN组件安装到BizTalk中,因此我们无法通过WCF成功调用业务流程。发生此错误:

Microsoft.BizTalk.Component.XmlAsmException: C0C01306: Cannot locate document specification because multiple schemas matched the message type "string".
   at Microsoft.BizTalk.Component.XmlAsmStreamWrapper.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.Xml.XmlTextReaderImpl.InitStreamInput(Uri baseUri, String baseUriStr, Stream stream, Byte[] bytes, Int32 byteCount, Encoding encoding)
   at System.Xml.XmlTextReaderImpl.FinishInitStream()
   at System.Xml.XmlReaderSettings.CreateReader(Stream input, Uri baseUri, String baseUriString, XmlParserContext inputContext)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkBodyWriter.WriteBizTalkBody(XmlDictionaryWriter writer)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkBodyWriter.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.OnWriteMessage(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Message message, BufferManager bufferManager, Int32 initial

这是可以理解的,因为BTARN组件已在mscorlib v2.0.0.0资源中安装了BizTalk.System,而我们的应用程序在部署时会安装mscorlib v4.0.0.0

这两个库的存在使BizTalk混乱,它无法决定使用哪个来解析类型string

我试图通过将我们的架构,管道和业务流程DLL中对System的所有引用标记为Use Specific Version来解决此问题,但这没有效果。

我该如何解决这个问题?

更新

这些是All Artifacts -> Schemas下列出的具有根名称string

的条目

listing of schemas with root name string

正如您所看到的,这里唯一重复的命名空间是两个具有空白命名空间的条目。这可能是冲突的原因吗?在安装BTARN之前,第三个条目(mscorlib v2.0.0.0)不存在。

我尝试定义自定义string数据类型,因此此处未引用mscorlib但到目前为止我无法成功完成此操作。

1 个答案:

答案 0 :(得分:1)

问题是您在同一名称空间中使用Root节点名称string(不包含string类型的元素)部署了模式架构。如果您无法更改(在这种情况下您可能无法更改?),请更改涉及这些消息的发送端口以使用PassThruTransmit管道而不是XMLTransmit。这样,它就不会尝试对该消息类型进行模式解析。

对于BizTalk将模式解析为文档,它依赖于根节点名称和命名空间形成唯一键 - 这是BTS.MessageType属性。在下面的屏幕截图中,从我现在正在使用的环境中获取,您可以看到我已经部署了三个模式(我通过转到管理控制台中的All Artifacts->Schemas节点获取此视图,并按节点名称,并转到我可以看到字符串作为根节点名称的地方):

Schemas

图片中的第一列为您提供了程序集名称 - 您可以看到两个来自GlobalPropertiesSchemas的库存到BizTalk,一个来自我的一个应用程序的自定义程序集(这里最右边的列显示了应用程序 - 默认情况下,我为了可读性而选择了另一列。

这些模式将具有以下MessageTypes:

  • http://www.w3.org/2003/05/soap-encoding#string
  • http://schemas.xmlsoap.org/soap/encoding/#string
  • http://schemas.microsoft.com/2003/10/Serialization/#string

因此,当管道按消息类型获取文档规范时,它不会获得任何重复的密钥违规。但是,如果任何两个命名空间的命名空间相同,则在尝试发送该消息类型的消息时会出现问题(您现在得到的错误)。您需要查看已部署的模式,并找出哪些程序集/应用程序具有具有根名称字符串的重复消息类型。很可能,RosettaNet加速器安装了您正在应用程序中部署的模式。解决方案是将其从您的应用程序中删除,并在您的应用程序中引用RosettaNet模式库。