2011-10-26 41 views
0

我消耗Biztalk的WCF服务与向导“添加生成的产品 - >消费WCF服务Biztalk的 - SOAP响应包含multiref因此它不能被处理

我的问题是服务正在返回无法解析的响应: 原因:解析传入文档时发生错误:“有多个根元素,第1行,第296位。”

这是令人惊讶的,因为我使用的自动生成模式

但由于服务使预期的操作是不是一个错误消息,我认为问题已与multiRef标签做

响应:

<ns1:sendSmsSubmissionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://mobicomp.com/smsexpress/webservice/server/message"> 
    <sendSmsSubmissionReturn href="#id0" /> 
</ns1:sendSmsSubmissionResponse> 
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:SubmissionStatus" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://mobicomp.com/smsexpress/webservice/server/message"> 
    <id xsi:type="soapenc:string">4336723</id> 
    <message xsi:type="soapenc:string">Submissão enviada para processamento.</message> 
    <status href="#id1" /> 
</multiRef> 
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">0</multiRef> 

架构

<xs:schema xmlns:tns="http://mobicomp.com/smsexpress/webservice/server/message" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://mobicomp.com/smsexpress/webservice/server/message" id="sendSmsSubmissionResponse" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation=".\SubmissionManagerService_mobicomp_com_smsexpress_webservice_server_message.xsd" /> 
    <xs:annotation> 
     <xs:appinfo> 
      <schemaInfo root_reference="sendSmsSubmissionResponse" xmlns="http://schemas.microsoft.com/BizTalk/2003" /> 
      <b:references> 
       <b:reference targetNamespace="http://common.server.webservice.smsexpress.mobicomp.com" /> 
       <b:reference targetNamespace="http://mobicomp.com/smsexpress/webservice/server/message" /> 
       <b:reference targetNamespace="http://schemas.xmlsoap.org/soap/encoding/" /> 
      </b:references> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:element name="sendSmsSubmissionResponse"> 
     <xs:annotation> 
      <xs:documentation>Wrapper element for message "sendSmsSubmissionResponse" of RPC operation "sendSmsSubmission".</xs:documentation> 
     </xs:annotation> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="sendSmsSubmissionReturn" type="tns:SubmissionStatus" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

我能做些什么才能避免这个错误?

谢谢!

编辑:

架构中的根引用指定为“sendSmsSubmissionResponse”并没有解决这个问题

回答

2

好,我解决了它

我打算把它写下来只是它万一有人在同样的问题

我创建了一个自定义的接收管道运行,其中:

解码,首先使用XSL将标准XML转换为标准Dissasemble去除肥皂信封并仅留下身体

然后biztalk接受XML消息, ED通常

我用的是一个我发现here但调整了XSL:

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" > 

<xsl:key name="multiref-by-id" match="multiRef" use="@id"/> 

<xsl:template match="/"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(@href, '#')]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | 
     key('multiref-by-id', substring-after(@href, '#'))/@*[not(local-name()='id' or local-name()='type')] | 
     key('multiref-by-id', substring-after(@href, '#'))/node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@href[starts-with(., '#')] | multiRef[@id] | @soapenc:root"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

+1

OMG你刚刚救了我的命。这对于在现代Java ws框架中使用讨厌的Axis 1 rpc /编码风格消息来说非常棒。 –

+0

你做了些什么调整? –

+0

对不起丹但它是两年前,不记得了。我所知道的是,因为我不是XSL专家,它只是“试错”,直到我获得预期结果 – Juan

0

您只能在BizTalk消息处理一个根元素。有多种方法可以做到这一点,但基本上,您需要在消息中重新分配每个重复的根,以便可以单独处理它或创建包装器元素以允许处理它。这种类型的组件必须存在于流水线阶段(自定义管道)。

您也可以将消息视为XML并根据大小以及是否需要索引来解析它。

+1

自定义管道,使用XSLT重新格式化? http://stackoverflow.com/questions/5185389/creating-xslt-transform-to-flatten-multiref-encoded-soap-message。我会尝试 – Juan