带有附件/MIME 内容的 SOAP

Posted

技术标签:

【中文标题】带有附件/MIME 内容的 SOAP【英文标题】:SOAP with Attachment / MIME content 【发布时间】:2011-07-17 20:30:18 【问题描述】:

需要从第三方发送和接收以下格式的 SOAP 消息:

POST /api HTTP/1.1 
Host: mytesthost.com
Content-Type: multipart/related;  
boundary="aMIMEBoundary";  
type="text/xml";  
start="<soap-start>" 
Content-Length: 2014 
SOAPAction: "" 

--aMIMEBoundary 
Content-Type: text/xml; charset=us-ascii 
Content-Transfer-Encoding: 7bit 
Content-ID: <soap-start> 

<?xml version="1.0" encoding="UTF-8"?> 
<soap-env:Envelope xmlns:soap-
env="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap-env:Header>
... 
</soap-env:Header> 
<soap-env:Body> 
...
</soap-env:Body> 
</soap-env:Envelope> 

--aMIMEBoundary 
Content-Type: image/gif 
Content-ID: dancingbaby.gif 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

<Binary Data Here> 

--aMIMEBoundary-- 

这是否被视为“带有附件的 SOAP”?我们刚开始研究这个问题,发现对使用 .NET 技术发送此类消息的支持非常少。

如果您有此类操作的起点,请告诉我。我们已经了解了 ServiceStack 和 PocketSOAP(.NET 的 SOAP 框架)。

我们还看到 DIME 和 MTOM 被提及。这可以代替 SWA(带附件的 SOAP)消息吗?

如果您需要更多信息,请告诉我。我们主要尝试将二进制数据作为 SOAP 消息的一部分发送,这是我们第一次接触它。谢谢!

【问题讨论】:

你的第三方远远落后于时代。 swa 和 DIME 都不是现行标准。他们几乎死了。 【参考方案1】:

注意ServiceStack 您可以通过 multipart/form-data Content-Type 接受上传的 HTTP 文件,这是实现最佳互操作性和性能的推荐方式。

GitHub's Rest Files project 中有一个这样做的示例。 下面是展示如何上传文件的 C# 客户端示例:

[Test]
public void Can_WebRequest_POST_upload_file_to_save_new_file_and_create_new_Directory()

    var restClient = CreateRestClient();

    var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt");

    var response = restClient.PostFile<FilesResponse>("files/UploadedFiles/", 
        fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name));

    Assert.That(Directory.Exists(FilesRootDir + "UploadedFiles"));
    Assert.That(File.ReadAllText(FilesRootDir + "UploadedFiles/TESTUPLOAD.txt"),
            Is.EqualTo(TestUploadFileContents));

您可以view-source of the Ajax example 了解如何在 javascript 中执行此操作。

这是处理上传文件的网络服务实现:

public override object OnPost(Files request)

    var targetDir = GetPath(request);

    var isExistingFile = targetDir.Exists
        && (targetDir.Attributes & FileAttributes.Directory) != FileAttributes.Directory;

    if (isExistingFile)
        throw new NotSupportedException(
        "POST only supports uploading new files. Use PUT to replace contents of an existing file");

    if (!Directory.Exists(targetDir.FullName))
    
        Directory.CreateDirectory(targetDir.FullName);
    

    foreach (var uploadedFile in base.RequestContext.Files)
    
        var newFilePath = Path.Combine(targetDir.FullName, uploadedFile.FileName);
        uploadedFile.SaveTo(newFilePath);
    

    return new FilesResponse();

希望对你有帮助!

【讨论】:

我想补充一点,我使用 SharpMIMETools 库来阅读附件。我推出了自己的传出解决方案。您提到“多部分”这一事实有很大帮助,因为搜索“带附件的 SOAP”产生的有用信息较少。

以上是关于带有附件/MIME 内容的 SOAP的主要内容,如果未能解决你的问题,请参考以下文章

带有多个附件 + html 的 SMTP 邮件 Mime

带有附件问题的 PHP Pear Mime 邮件

python 2.7 smtplib 和 mime 的电子邮件附件问题

带有正文内容的 Python 电子邮件多部分

为啥电子邮件在正文中显示 mime 边界/

带有附件的梨邮件在 $mime = new Mail_mime 处失败