在SoapUI中使用MTOM时文件无法正确上传

lak*_*man 6 web-services mtom soapui

我正在使用SoapUI 5.1.3版本.我发送以下请求到我们的服务.

<soapenv:Envelope       xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:upl="http://upload.application.carbon.wso2.org" xmlns:xsd="http://upload.application.carbon.wso2.org/xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <upl:uploadApp>
         <!--Zero or more repetitions:-->
         <upl:fileItems>
            <!--Optional:-->
            <xsd:dataHandler>UEsDBBLjAuMC52MjAxMTA1MjcxNTIxMDAvYXJ0aWZhY3QueG1sUEsFBgAAAAAJAAkAMAMAAC4IAAAAAA==</xsd:dataHandler>
            <!--Optional:-->
            <xsd:fileName>ESBproject1-1.0.0.car</xsd:fileName>
            <!--Optional:-->
            <xsd:fileType>jar</xsd:fileType>
         </upl:fileItems>
      </upl:uploadApp>
   </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

在Web服务端,当我检查dataHandler值时,它似乎在字符串的末尾被截断.我使用Insert file as Base64上下文菜单选项插入文件.我将Enable MTOM属性更改为true.错过发送到Web服务的部分数据可能是什么原因?

UPDATE

我编写了一个HTTP服务器来捕获soap请求,而不是通过将SoapUI中的url更改为Web服务http://localhost:5000/.下面是我写的服务器

public static void main(String[] args) throws Exception {
    ServerSocket server = new ServerSocket(5000);
    Socket conn = server.accept();
    StringBuilder sb = new StringBuilder();
    //getBytes() method returns a byte array for InputStream 
    ByteArrayInputStream reader = new ByteArrayInputStream(getBytes(conn.getInputStream()));

    int ch;
    while ( (ch = reader.read()) != -1) {
        sb.append((char)ch);
    }
    System.out.println("Your  message: "+sb.toString()); 
}
Run Code Online (Sandbox Code Playgroud)

运行HTTP服务器后,我发送了上面提到的soap请求,我可以看到http客户端也收到了与上面相同的请求.但由于我已启用MTOM,因此应修改SoapUI请求,并且HTTP服务器应从上述soap请求收到不同的请求.根据此SO问题中描述的MTOM定义,二进制dataHandler值应该移出包络.它应该用xop标签和引用替换.作为一个例子,信封应该是类似下面的东西.

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
 <soapenv:Body>
   <ns2:uploadApp xmlns:ns2="http://upload.application.carbon.wso2.org">
     <ns2:fileItems>
        <ns1:dataHandler xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">
           <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.4aefed8d8cef221bc29fec3e7341b21813a53a5181b39c2b@apache.org" />
        </ns1:dataHandler>
        <ns1:fileName xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">ESBproject1-1.0.0.car</ns1:fileName>
        <ns1:fileType xmlns:ns1="http://upload.application.carbon.wso2.org/xsd">jar</ns1:fileType>
     </ns2:fileItems>
   </ns2:uploadApp>
 </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

我的问题是,是在SoapUI中启用MTOM的正确方法还是这个错误?

aba*_*hel -1

http://www.soapui.org/soap-and-wsdl/headers-and-attachments.html上的文档说“enable MTOM = true”会执行以下操作。

1-传出消息作为具有相应 MTOM 内容类型的 Mime Multipart 消息发送

2-第一个 Mime 部分包含消息,第二个包含附件

3-消息中的 ClaimImage 元素包含引用第二个 Mime-Part(突出显示)的 XOP Include 元素