带有附件/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的主要内容,如果未能解决你的问题,请参考以下文章