ServiceStack клиент добавить вложение - PullRequest
4 голосов
/ 28 ноября 2011

Я использую ServiceStack.ServiceClient.Web.XmlServiceClient для подключения к веб-сервису.Есть ли способ добавить вложение к запросу?

Дополнительная информация:

Я пытаюсь избежать использования Microsoft.Web.Services2, потому что яиспользуя моно.Я пытаюсь загрузить файл данных XML вместе с запросом XML.Как и в этом вопросе: Загрузить единицу отчета через веб-сервис в C # .net на jasperserver

1 Ответ

14 голосов
/ 28 ноября 2011

Для загрузки файлов лучшим (и самым быстрым) способом является , а не , кодировать его как обычную переменную запроса, а просто загрузить его в веб-службу как обычный HTTP Upload с ContentType multipart / form-data , т. е. как формы HTML в настоящее время отправляют файлы на URL.

ServiceStack имеет встроенную поддержку для обработки загруженных файлов таким образом, где полный пример того, как это сделатьв примере проекта RestFiles ServiceStack .

Для загрузки файлов с использованием ServiceClient вы можете использовать метод .PostFile () , показанный в этом примере :

var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt");

var response = restClient.PostFile<FilesResponse>(WebServiceHostUrl + "files/README.txt",
    fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name));

Все загруженные файлы доступны через коллекцию base.RequestContext.Files, которую вы можете легко обработать с помощью метода SaveTo () (в виде потока или файла).

foreach (var uploadedFile in base.RequestContext.Files)
{
    var newFilePath = Path.Combine(targetDir.FullName, uploadedFile.FileName);
    uploadedFile.SaveTo(newFilePath);
}

Аналогично, для возврата ответа файла (в виде вложения или напрямую) вам просто нужно вернуть FileInfo в HttpResult, например :

return new HttpResult(FileInfo, asAttachment:true);

Несколько файлов Uploads

Вы также можете использовать API PostFilesWithRequest, доступные на всех клиентских сервисах .NET, для загрузки нескольких потоков в рамках одного HTTP-запроса.Он поддерживает заполнение Request DTO любой комбинацией QueryString и POST'ed FormData в дополнение к нескольким потокам данных для загрузки файлов, например:

using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
    var client = new JsonServiceClient(baseUrl);
    var response = client.PostFilesWithRequest<MultipleFileUploadResponse>(
        "/multi-fileuploads?CustomerId=123",
        new MultipleFileUpload { CustomerName = "Foo,Bar" },
        new[] {
            new UploadFile("upload1.png", stream1),
            new UploadFile("upload2.png", stream2),
        });
}

Пример с использованием толькоТипичный запрос DTO.JsonHttpClient также включает асинхронные эквиваленты для каждого из PostFilesWithRequest API:

using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
    var client = new JsonHttpClient(baseUrl);
    var response = await client.PostFilesWithRequestAsync<MultipleFileUploadResponse>(
        new MultipleFileUpload { CustomerId = 123, CustomerName = "Foo,Bar" },
        new[] {
            new UploadFile("upload1.png", stream1),
            new UploadFile("upload2.png", stream2),
        });
}
...