使用 MTOM 优化使用 SOAP 1.1 操作发送附件时出错

Error consuming SOAP 1.1 operation send attachment using MTOM optimization

我正在尝试使用接收带有附件的消息的 SOAP 服务。使用 SoapUI,我成功调用了服务,但是使用 WSO2 Integrator,我从服务器收到以下响应错误:

OSB-382000: Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]</faultstring><detail><con:stack-trace xmlns:con="http://www.bea.com/wli/sb/context">com.bea.wli.sb.service.handlerchain.HandlerException: Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '&lt;'
 at [row,col {unknown-source}]: [1,1]
    at com.bea.wli.sb.service.disi.handlerchain.handlers.InboundDISIHandler.dispatch(InboundDISIHandler.java:148)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.disi.handlerchain.handlers.InboundWssPhase1DISIHandler.dispatch(InboundWssPhase1DISIHandler.java:100)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.InboundMessageContentHandler.dispatch(InboundMessageContentHandler.java:169)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.CheckAccessControl.dispatch(CheckAccessControl.java:65)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.UpdateInboundTransportStatistics.dispatch(UpdateInboundTransportStatistics.java:64)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.InboundMessageTracing.dispatch(InboundMessageTracing.java:80)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.DefaultInboundErrorHandler.dispatch(DefaultInboundErrorHandler.java:44)
    at com.bea.wli.sb.service.handlerchain.InboundHandlerChain.dispatch(InboundHandlerChain.java:134)
    at com.bea.wli.sb.transports.TransportDispatcherClient.dispatch(TransportDispatcherClient.java:91)
    at com.bea.wli.sb.transports.TransportManagerImpl.receiveMessage(TransportManagerImpl.java:352)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.invokePipeline(RequestHelperBase.java:200)
    at com.bea.wli.sb.transports.http.wls.HttpTransportServlet$RequestHelperWLS.invokePipeline(HttpTransportServlet.java:228)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.run(RequestHelperBase.java:175)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.run(RequestHelperBase.java:173)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146)
    at com.bea.wli.sb.util.security.SecurityUtils.executeAs(SecurityUtils.java:102)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.securedInvoke(RequestHelperBase.java:172)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.service(RequestHelperBase.java:124)
    at com.bea.wli.sb.transports.http.wls.HttpTransportServlet.service(HttpTransportServlet.java:129)
    at weblogic.servlet.FutureResponseServlet.service(FutureResponseServlet.java:24)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:220)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3436)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)

我怀疑错误是由于 HTTP headers 引起的,但我找不到任何其他参考来更改这些 headers 以使其看起来像 SoapUI 的。有些 header 是相等的,有些则不是。我尝试设置一些 header 以使它们与 SoapUI 中的相同,但没有成功。

以下是我正在使用的资源(删除了所有日志以适合此处)。负载因敏感数据而恢复,但假设 WSO2 Integrator 生成的 SOAP 信封没问题,因为从服务器收到了从 SoapUI 提交的相同信封,没有任何错误:

端点:

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="envio_informacao_res_dados_clinicos">
    <address uri="http://xpto.com.br/service?WSDL" format="soap11" optimize="mtom">
        <enableSec policy="wssSecurityRES"/>
    </address>
</endpoint>

序列(将附件设置为有效载荷):

<sequence xmlns="http://ws.apache.org/ns/synapse" name="attachment">
    <property name="attachmentContent" expression="get-property('ATTACHMENT_CONTENT')"/>
    <property name="attachmentContentID" expression="get-property('ATTACHMENT_CONTENT_ID')"/>
    <class name="br.com.modoagil.MTOMAttachmentFilesMediator"/>
</sequence>

代理服务(仅供测试):

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="AttachmentFileProxyService" transports="https,http" statistics="disable" trace="disable" startOnLoad="true">
  <target>
    <inSequence>
      <property name="ATTACHMENT_CONTENT" expression="$body/*" />
      <property name="ATTACHMENT_CONTENT_ID" value="AnexoLaboratorio.xml" />
      <payloadFactory media-type="xml">
        <format>
          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://xpto.com.br/schemas/servico/envio/informacao/res/v1.00" xmlns:v17="http://xpto.com.br/schemas/comum/tipos/complexos/anexos/v1.00" xmlns:xm="http://www.w3.org/2005/05/xmlmime">
            <soapenv:Header />
            <soapenv:Body>
              <v1:requisicaoEnvioInformacaoRES>
                <v1:cabecalhoRequisicao>
                  <!-- omitted -->
                </v1:cabecalhoRequisicao>
                <v1:corpoRequisicao>
                  <v1:beneficiario>
                    <!-- omitted -->
                  </v1:beneficiario>
                  <v1:profissional>
                    <!-- omitted -->
                  </v1:profissional>
                  <v1:informacaoClinica>
                    <v17:anexoComposicao xm:contentType="application/xml" xm:expectedContentTypes="application/xml" />
                    <!-- omitted -->
                  </v1:informacaoClinica>
                </v1:corpoRequisicao>
              </v1:requisicaoEnvioInformacaoRES>
            </soapenv:Body>
          </soapenv:Envelope>
        </format>
        <args />
      </payloadFactory>
      <sequence key="attachment" />
      <header name="Action" action="remove" />
      <property name="SOAPAction" action="remove" />
      <property name="FORCE_HTTP_1.0" value="true" scope="axis2" />
      <property name="SOAPAction" value="envio_informacao_res" scope="transport" />
      <property name="Proxy-Authorization" scope="transport" expression="fn:concat('Basic ', base64Encode('ZZZZ:YYYY'))" />
      <send>
        <endpoint key="envio_informacao_res_dados_clinicos" />
      </send>
    </inSequence>
    <outSequence>
      <property name="enableMTOM" value="true" scope="axis2" />
      <send />
    </outSequence>
  </target>
</proxy>

自定义调解器:

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMText;
import org.apache.axiom.soap.SOAPBody;
import org.apache.synapse.MessageContext;
import org.apache.synapse.SynapseException;
import org.apache.synapse.mediators.AbstractMediator;

public class MTOMAttachmentFilesMediator extends AbstractMediator {

    @Override
    public boolean mediate(final MessageContext context) {
        this.addAttachmentToRequest(context);
        return true;
    }

    private void addAttachmentToRequest(final MessageContext context) {
        final String attachmentContent = (String) context.getProperty("attachmentContent");
        final String attachmentContentID = (String) context.getProperty("attachmentContentID");

        Path tempContentFile = null;
        try {
            tempContentFile = Files.createTempFile(attachmentContentID + "-" + System.currentTimeMillis(), ".bin");
            Files.write(tempContentFile, attachmentContent.getBytes(Charset.defaultCharset()));
        } catch (final IOException e) {
            super.handleException("Error while creating attachment file: " + e.getMessage(), e, context);
        }

        if (tempContentFile == null) {
            throw new SynapseException("Temporary attachment file must not be null here");
        }

        final SOAPBody body = context.getEnvelope().getBody();
        final OMElement requisicaoEnvioInformacaoRES = body.getFirstElement();
        final OMElement corpoRequisicao = (OMElement) requisicaoEnvioInformacaoRES.getChildrenWithName(new QName("corpoRequisicao")).next();
        final OMElement informacaoClinica = (OMElement) corpoRequisicao.getChildrenWithName(new QName("informacaoClinica")).next();

        final OMFactory factory = informacaoClinica.getOMFactory();

        final OMElement anexoComposicao = (OMElement) informacaoClinica.getChildrenWithName(new QName("anexoComposicao")).next();
        final FileDataSource fileDataSource = new FileDataSource(tempContentFile.toFile());
        final DataHandler dataHandler = new DataHandler(fileDataSource);
        final OMText bynaryNode = factory.createOMText(dataHandler, true);
        bynaryNode.setContentID(attachmentContentID);
        anexoComposicao.addChild(bynaryNode);
    }

}

SoapUI "full request/response":

POST /service?WSDL HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: multipart/related; type="application/xop+xml"; start="<rootpart@soapui.org>"; start-info="text/xml"; boundary="----=_Part_10_1408830521.1496694507193"
SOAPAction: "envio_informacao_res"
Authorization: Basic omitted
MIME-Version: 1.0
Content-Length: 33427
Host: xpto.com.br.br:7300
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

------=_Part_10_1408830521.1496694507193

Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: 8bit
Content-ID: <rootpart@soapui.org>

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://xpto.com.br/schemas/servico/envio/informacao/res/v1.00" xmlns:v17="http://xpto.com.br/schemas/comum/tipos/complexos/anexos/v1.00" xmlns:xm="http://www.w3.org/2005/05/xmlmime">
    <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:UsernameToken wsu:Id="UsernameToken-CAD2037163FCADC4A5149669450719220">
                <wsse:Username>omitted</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">omitted</wsse:Password>
                <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">omitted==</wsse:Nonce>
                <wsu:Created>2017-06-05T20:28:27.192Z</wsu:Created>
            </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body>
        <v1:requisicaoEnvioInformacaoRES>
            <v1:cabecalhoRequisicao>
                <!-- omitted -->
            </v1:cabecalhoRequisicao>
            <v1:corpoRequisicao>
                <v1:beneficiario>
                    <!-- omitted -->
                </v1:beneficiario>
                <v1:profissional>
                    <!-- omitted -->
                </v1:profissional>
                <v1:informacaoClinica>
                    <v17:anexoComposicao xm:contentType="application/xml" xm:expectedContentTypes="application/xml">
                        <inc:Include xmlns:inc="http://www.w3.org/2004/08/xop/include" href="cid:AnexoLaboratorio.xml" />
                    </v17:anexoComposicao>
                    <!-- omitted -->
                </v1:informacaoClinica>
            </v1:corpoRequisicao>
        </v1:requisicaoEnvioInformacaoRES>
    </soapenv:Body>
</soapenv:Envelope>

------=_Part_10_1408830521.1496694507193

Content-Type: text/xml; charset=us-ascii; name=AnexoLaboratorio.xml
Content-Transfer-Encoding: 7bit
Content-ID: <AnexoLaboratorio.xml>
Content-Disposition: attachment; name="AnexoLaboratorio.xml"; filename="AnexoLaboratorio.xml"

<?xml version="1.0" encoding="UTF-8"?>
<Clinical_Summary_Events xmlns:oe="http://schemas.openehr.org/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.oceanehr.com/templates" archetype_node_id="openEHR-EHR-COMPOSITION.encounter.v1" template_id="clinical-summary-events" type="COMPOSITION" xsi:schemaLocation="http://schemas.oceanehr.com/templates templates/clinical-summary-events.xsd">
  <!-- omitted -->
</Clinical_Summary_Events>

------=_Part_10_1408830521.1496694507193--

##### RESPONSE #####

HTTP/1.1 200 OK
Server: Oracle-Traffic-Director/11.1.1.9
Date: Mon, 05 Jun 2017 20:28:30 GMT
Content-length: 3463
Content-type: text/xml; charset=UTF-8
X-oracle-dms-ecid: XeMsH1O_000000000
Via: 1.1 net-QA
Proxy-agent: Oracle-Traffic-Director/11.1.1.9

<soapenv:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/><soap-env:Body xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"><ptucsseir:respostaEnvioInformacaoRES xmlns:ptucsseir="http://xpto.com.br/schemas/servico/envio/informacao/res/v1.00"> <!-- omitted --></ptucsseir:respostaEnvioInformacaoRES></soap-env:Body></soapenv:Envelope>"

WSO2 EI "full request/response":

POST /service?WSDL HTTP/1.0
SOAPAction: envio_informacao_res
Accept-Encoding: gzip,deflate
Proxy-Authorization: Basic omitted
Content-Type: text/xml; charset=UTF-8
Content-Length: 41934
Host: xpto.com.br:7300
Connection: Keep-Alive
User-Agent: Synapse-PT-HttpComponents-NIO

--MIMEBoundary_20282c2967f861ead2423a50af020431e31644c6c1d1eeb6

Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.30282c2967f861ead2423a50af020431e31644c6c1d1eeb6@apache.org>

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://xpto.com.br/schemas/servico/envio/informacao/res/v1.00" xmlns:v17="http://xpto.com.br/schemas/comum/tipos/complexos/anexos/v1.00" xmlns:xm="http://www.w3.org/2005/05/xmlmime">
    <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
            <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1">
                <wsse:Username>omitted</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">omitted</wsse:Password>
                <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">omitted</wsse:Nonce>
                <wsu:Created>2017-06-06T15:01:38.098Z</wsu:Created>
            </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body>
        <v1:requisicaoEnvioInformacaoRES>
            <v1:cabecalhoRequisicao>
                <!-- omitted -->
            </v1:cabecalhoRequisicao>
            <v1:corpoRequisicao>
                <v1:beneficiario>
                    <!-- omitted -->
                </v1:beneficiario>
                <v1:profissional>
                    <!-- omitted -->
                </v1:profissional>
                <v1:informacaoClinica>
                    <v17:anexoComposicao xm:contentType="application/xml" xm:expectedContentTypes="application/xml">
                        <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:AnexoLaboratorio.xml" />
                    </v17:anexoComposicao>
                    <!-- omitted -->
                </v1:informacaoClinica>
            </v1:corpoRequisicao>
        </v1:requisicaoEnvioInformacaoRES>
    </soapenv:Body>
</soapenv:Envelope>

--MIMEBoundary_20282c2967f861ead2423a50af020431e31644c6c1d1eeb6

Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <AnexoLaboratorio.xml>

<Clinical_Summary_Events xmlns="http://schemas.oceanehr.com/templates" xmlns:oe="http://schemas.openehr.org/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" archetype_node_id="openEHR-EHR-COMPOSITION.encounter.v1" template_id="clinical-summary-events" type="COMPOSITION" xsi:schemaLocation="http://schemas.oceanehr.com/templates templates/clinical-summary-events.xsd">
    <!-- omitted -->
</Clinical_Summary_Events>

--MIMEBoundary_20282c2967f861ead2423a50af020431e31644c6c1d1eeb6--

##### RESPONSE #####

--MIMEBoundary_00282c2967f861ea3c123a50af020431f31644c6c1d1eeb6
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.10282c2967f861ea3c123a50af020431f31644c6c1d1eeb6@apache.org>

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>OSB-382000: Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '&lt;'
 at [row,col {unknown-source}]: [1,1]</faultstring><detail><con:stack-trace xmlns:con="http://www.bea.com/wli/sb/context">com.bea.wli.sb.service.handlerchain.HandlerException: Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '&lt;'
 at [row,col {unknown-source}]: [1,1]
    at com.bea.wli.sb.service.disi.handlerchain.handlers.InboundDISIHandler.dispatch(InboundDISIHandler.java:148)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.disi.handlerchain.handlers.InboundWssPhase1DISIHandler.dispatch(InboundWssPhase1DISIHandler.java:100)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.InboundMessageContentHandler.dispatch(InboundMessageContentHandler.java:169)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.CheckAccessControl.dispatch(CheckAccessControl.java:65)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.UpdateInboundTransportStatistics.dispatch(UpdateInboundTransportStatistics.java:64)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.InboundMessageTracing.dispatch(InboundMessageTracing.java:80)
    at com.bea.wli.sb.service.handlerchain.handlers.AbstractHandler.dispatch(AbstractHandler.java:131)
    at com.bea.wli.sb.service.handlerchain.handlers.DefaultInboundErrorHandler.dispatch(DefaultInboundErrorHandler.java:44)
    at com.bea.wli.sb.service.handlerchain.InboundHandlerChain.dispatch(InboundHandlerChain.java:134)
    at com.bea.wli.sb.transports.TransportDispatcherClient.dispatch(TransportDispatcherClient.java:91)
    at com.bea.wli.sb.transports.TransportManagerImpl.receiveMessage(TransportManagerImpl.java:352)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.invokePipeline(RequestHelperBase.java:200)
    at com.bea.wli.sb.transports.http.wls.HttpTransportServlet$RequestHelperWLS.invokePipeline(HttpTransportServlet.java:228)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.run(RequestHelperBase.java:175)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.run(RequestHelperBase.java:173)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146)
    at com.bea.wli.sb.util.security.SecurityUtils.executeAs(SecurityUtils.java:102)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.securedInvoke(RequestHelperBase.java:172)
    at com.bea.wli.sb.transports.http.generic.RequestHelperBase.service(RequestHelperBase.java:124)
    at com.bea.wli.sb.transports.http.wls.HttpTransportServlet.service(HttpTransportServlet.java:129)
    at weblogic.servlet.FutureResponseServlet.service(FutureResponseServlet.java:24)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:220)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3436)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: com.sun.xml.ws.protocol.soap.MessageCreationException: Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '&lt;'
 at [row,col {unknown-source}]: [1,1]
    at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:319)
    at com.sun.xml.ws.api.message.MessageContextFactory.createContext(MessageContextFactory.java:130)
    at com.oracle.webservices.impl.disi.context.DISIMessageContextFactory.createContext(DISIMessageContextFactory.java:114)
    at com.oracle.webservices.impl.disi.service.DISIAdapter.createContext(DISIAdapter.java:227)
    at com.bea.wli.sb.service.disi.handlerchain.handlers.InboundDISIHandler.dispatch(InboundDISIHandler.java:88)
    ... 47 more
Caused by: com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '&lt;'
 at [row,col {unknown-source}]: [1,1]
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.wrapException(XMLStreamReaderUtil.java:326)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:99)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.nextContent(XMLStreamReaderUtil.java:169)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:104)
    at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:215)
    at com.oracle.webservices.impl.encoding.StreamDecoderImpl.decode(StreamDecoderImpl.java:64)
    at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:249)
    at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:166)
    at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:314)
    ... 51 more
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '-' (code 45) in prolog; expected '&lt;'
 at [row,col {unknown-source}]: [1,1]
    at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:639)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2052)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1134)
    at com.sun.xml.ws.util.xml.XMLStreamReaderFilter.next(XMLStreamReaderFilter.java:96)
    at com.sun.xml.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:80)
    ... 58 more
</con:stack-trace></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>
--MIMEBoundary_00282c2967f861ea3c123a50af020431f31644c6c1d1eeb6--

那么,有没有人有类似的问题要用 WSO2 EI/WSO2 ESB 做 SOAP/MTOM 请求?

编辑:

WSO2 集成版本:6.1.1

WSO2 EI 是 运行 默认配置,没有更改任何配置,甚至没有在 axis2.xml 配置文件中启用 MTOM 的属性。

找到解决办法。我只是将此 属性 添加到代理中:

<property name="messageType" value="multipart/related" scope="axis2"/>

也许这不是最好的解决方案,因为 headers 和以前一样,SoapUI 显然生成了一个更干净的请求,但现在服务正确接收了 WSO2 EI 发送的消息。

我不知道为什么,但现在 WSO2 EI 在 SOAP 信封上发送内联附件,而不是像以前一样使用 XOP 包含在单独的 "section" 中发送附件 -看起来像 base 64 编码。

现在没问题,如果这个解决方案导致问题我创建其他问题。