我们安装了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
:
正如您所看到的,这里唯一重复的命名空间是两个具有空白命名空间的条目。这可能是冲突的原因吗?在安装BTARN之前,第三个条目(mscorlib v2.0.0.0
)不存在。
我尝试定义自定义string
数据类型,因此此处未引用mscorlib
但到目前为止我无法成功完成此操作。
答案 0 :(得分:1)
问题是您在同一名称空间中使用Root节点名称string(不包含string类型的元素)部署了模式架构。如果您无法更改(在这种情况下您可能无法更改?),请更改涉及这些消息的发送端口以使用PassThruTransmit
管道而不是XMLTransmit
。这样,它就不会尝试对该消息类型进行模式解析。
对于BizTalk将模式解析为文档,它依赖于根节点名称和命名空间形成唯一键 - 这是BTS.MessageType属性。在下面的屏幕截图中,从我现在正在使用的环境中获取,您可以看到我已经部署了三个模式(我通过转到管理控制台中的All Artifacts->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模式库。