4

我正在使用 ServiceStack.ServiceClient.Web.XmlServiceClient 连接到 Web 服务。有没有办法在请求中添加附件?

更多信息:

我想要做的是避免使用 Microsoft.Web.Services2,因为我使用的是 Mono。我正在尝试上传 XML 数据文件以及 XML 请求。就像在这个问题中一样: Upload report unit via webservice in C# .net to jasperserver

4

1 回答 1

15

上传文件最好(也是最快)的方法是将其编码为普通请求变量,而只需将其作为普通 HTTP 上传到 Web 服务 ContentType multipart/form-data,即 HTML 表单当前如何将文件发送到网址。

ServiceStack内置支持以这种方式处理上传的文件,在ServiceStack 的 RestFiles 示例项目中提供了如何执行此操作的完整示例。

要使用 ServiceClient 上传文件,您可以使用本示例中的.PostFile<T>()方法:

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

与返回文件响应类似(作为附件或直接),您只需要在 HttpResult 中返回 FileInfo,例如

return new HttpResult(FileInfo, asAttachment:true);

多个文件上传

您还可以使用PostFilesWithRequest所有 .NET 服务客户端中可用的 API 在单个 HTTP 请求中上传多个流。除了多个文件上传数据流之外,它还支持使用QueryString 和 POST'ed FormData的任意组合填充请求 DTO ,例如:

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还包括每个PostFilesWithRequestAPI的异步等效项:

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),
        });
}
于 2011-11-28T18:56:58.447 回答