C# 带BTARN的BizTalk:找不到文档规范,因为多个架构与消息类型“匹配”;“字符串”;
我们安装了BizTalk 2013,其中还安装了用于RosettaNet的BizTalk加速器(BTARN)。有一个业务流程作为WCF服务使用(使用BizTalk WCF服务向导生成)。编排是根据.NET v4.5编译的,通过WCF调用编排的代码也是如此。业务流程的传入消息类型是我们定义的模式(也是根据v4.5编译的),其中包含一组字符串。下面是该模式的一个小片段:C# 带BTARN的BizTalk:找不到文档规范,因为多个架构与消息类型“匹配”;“字符串”;,c#,wcf,biztalk,biztalk-2013,mscorlib,C#,Wcf,Biztalk,Biztalk 2013,Mscorlib,我们安装了BizTalk 2013,其中还安装了用于RosettaNet的BizTalk加速器(BTARN)。有一个业务流程作为WCF服务使用(使用BizTalk WCF服务向导生成)。编排是根据.NET v4.5编译的,通过WCF调用编排的代码也是如此。业务流程的传入消息类型是我们定义的模式(也是根据v4.5编译的),其中包含一组字符串。下面是该模式的一个小片段: <?xml version="1.0" encoding="utf-16"?> <xs:schema xmlns
<?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组件已将mscorlib v2.0.0
安装到BizTalk.System
资源中,并且我们的应用程序在部署时安装了mscorlib v4.0.0
这两个库的存在混淆了BizTalk,它无法决定使用哪一个来解析类型字符串
我试图通过将模式、管道和编排DLL中对System
的所有引用标记为使用特定版本来解决这个问题,但这没有效果
我如何解决这个问题
更新:
这些条目列在All artifact->Schemas
下,具有根名称string
:
正如您所看到的,这里唯一重复的名称空间是两个具有空白名称空间的条目。这可能是冲突的原因吗?在安装BTARN之前,第三个条目(mscorlib v2.0.0.0
)不存在
我试图定义一个自定义的string
数据类型,因此这里没有引用mscorlib
,但到目前为止我还无法成功地这样做。问题是,在同一命名空间中部署了根节点名为string(而不是类型为string的元素)的模式。如果您无法更改(在本例中,您可能无法更改?),请将涉及这些消息的发送端口更改为使用PassThruTransmit
管道,而不是xmltranmit
。这样,它就不会尝试对该消息类型执行模式解析
BizTalk要将架构解析为文档,它依赖于根节点名称和命名空间来形成唯一键—这是BTS.MessageType属性。在下面的屏幕截图中,从我现在工作的环境中,您可以看到我部署了三个模式(我通过转到管理控制台中的All Artifacts->schemas
节点,按节点名对其进行排序,并转到可以看到字符串作为根节点名的位置来获得此视图):
图片中的第一列提供了程序集名称-您可以看到两个来自GlobalPropertiesSchemas(存储到BizTalk),一个来自我的一个应用程序的自定义程序集(此处最右边的列显示了该应用程序-默认情况下,为了可读性,我还删除了另一列)
这些架构将具有以下消息类型:
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架构库。我更新了我的帖子,以显示带有根名称的项,该名称为字符串
,我觉得mscorlib被导入BizTalk数据库似乎很奇怪(与仅从GAC引用不同)-我不能说我以前见过这种情况。BizTalk将字符串数据类型视为架构似乎也很奇怪。如果无法解决此问题,只需将发送此架构的端口更改为PassthrusTransmit,然后它就不会尝试进行架构解析。
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