2011-03-18 78 views
2

需要在以下格式从第三方发送和接收SOAP消息:SOAP带附件/ MIME内容

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(SOAP Frameworks for .NET)。

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

如果您需要更多信息,请让我知道。我们主要致力于发送二进制数据作为SOAP消息的一部分,这是我们第一次接触到它。谢谢!

+1

您的第三方是时代背后的路。 swa和DIME都不是有效的标准。他们几乎死了。 – 2011-03-18 01:32:58

回答

1

注意ServiceStack您可以通过multipart/form-data接受上传的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中做到这一点。

这里是Web服务实现来处理上传的文件:

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

希望它能帮助!

+0

我想补充说我使用SharpMIMETools库来读取附件。我推出了自己的即时解决方案。事实上,你提到“多部分”是什么帮助了很多,因为搜索“SOAP瓦特/附件”产生较少有用的信息。 – 2011-05-12 11:42:40