需要从第三方发送和接收以下格式的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消息的一部分,这是我们第一次接触它。谢谢!
答案 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();
}
希望它有所帮助!