Biztalk - SOAP-ответ содержит несколько ссылок, поэтому он не может быть обработан - PullRequest
0 голосов
/ 26 октября 2011

Я использую службу WCF в Biztalk с помощью мастера "Добавить сгенерированные элементы -> Использование службы WCF "

Проблема, которую я имею, заключается в возврате службыответ, который не может быть проанализирован: Причина: при синтаксическом анализе входящего документа произошла ошибка: «Есть несколько корневых элементов. Строка 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 ]

2 голосов
/ 18 ноября 2011

Хорошо, я решил это

Я собираюсь записать это на тот случай, если кто-то столкнется с той же проблемой

Я создал пользовательский конвейер приема , в котором:

Декодируйте, сначала преобразуйте XML в стандартную версию с помощью XSL. Dissasemble удалить мыльный конверт и просто оставить тело

Затем biztalk принимает сообщение XML, и я продолжаю в обычном режиме

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>

0 голосов
/ 26 октября 2011

В обработке сообщений BizTalk может быть только один корневой элемент.Есть несколько способов сделать это, но по сути вам необходимо откатить каждый повторный корень в сообщении, чтобы его можно было обработать отдельно или создать элемент-обертку, чтобы он мог быть обработан.Этот тип компонента должен существовать на этапе конвейерной обработки (настраиваемый конвейер).

Вы также можете обрабатывать сообщение как XML и анализировать его в зависимости от размера и необходимости индексирования.

...