SOAP с вложением / MIME-контентом - PullRequest
2 голосов
/ 18 марта 2011

Необходимо отправить и получить сообщение 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 Frameworks для .NET).

Мы также видели упоминавшиеся DIME и MTOM. Может ли это заменить сообщение SWA (SOAP с вложением)?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. В основном мы пытаемся сосредоточиться на отправке двоичных данных как части сообщения SOAP, и это наше первое знакомство с ним. Спасибо!

1 Ответ

1 голос
/ 05 апреля 2011

Примечание в ServiceStack вы можете принимать загруженные файлы HTTP через multipart / form-data Content-Type, который является рекомендуемым способом для оптимальной совместимости и производительности.* Пример этого можно сделать в проекте GitHub's Rest Files .Вот пример клиента 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 примера Ajax , чтобы увидеть, как это сделать в 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();
}

Надеюсь, это поможет!

...