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

时间:2015-05-21 10:06:07

标签: web-services soapui mtom

我正在使用SoapUI 5.1.3版本。我将以下请求发送给我们的服务。

list

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

更新

我写了一个HTTP服务器,通过将SoapUI中的url更改为Enable MTOM来捕获soap请求,而不将其发送到Web服务。下面是我写的服务器

http://localhost:5000/

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

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()); 
}

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

2 个答案:

答案 0 :(得分:1)

对于未来的读者:

  

我使用Insert file as Base64上下文菜单选项插入了文件。我将Enable MTOM属性更改为true。

将文件作为Base64插入会使内容直接包含在XML中,而不是作为附件。你会看到类似的东西:

<myfile>some long Base64-encoded string here</myfile>

为此,SoapUI不会将Base64字符串转换为附件,因此不需要MTOM。您可以同时选择Enable MTOMForce MTOM,但即使这样也不会将二进制内容作为附件发送。相反,您将获得仅包含单个部分的多部分消息(是具有嵌入式Base64编码文件的XML)。

要获取MTOM附件,您应该将该文件作为附件添加到请求中(请参阅请求编辑器下方的“附件”选项卡),这将为您提供内容ID。接下来,使用cid:引用该内容ID,例如:

<myfile>cid:myfile.png</myfile>

现在,无论Force MTOM如何,SoapUI都会创建一个包含两部分的多部分消息。

答案 1 :(得分:-1)

http://www.soapui.org/soap-and-wsdl/headers-and-attachments.html处的文件说&#34;启用MTOM = true&#34;做了以下事情。

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

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

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