带附件/ MIME内容的SOAP

时间:2011-03-18 01:26:37

标签: c# web-services .net-3.5 soap mime

需要从第三方发送和接收以下格式的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(SOAP框架for .NET)。

我们也看到过DIME和MTOM。这可以代替SWA(SOAP with Attachment)消息吗?

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

1 个答案:

答案 0 :(得分: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中执行此操作。

以下是处理上传文件的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();
}

希望它有所帮助!