我正在使用 ServiceStack.ServiceClient.Web.XmlServiceClient 连接到 Web 服务。有没有办法在请求中添加附件?
更多信息:
我想要做的是避免使用 Microsoft.Web.Services2,因为我使用的是 Mono。我正在尝试上传 XML 数据文件以及 XML 请求。就像在这个问题中一样: Upload report unit via webservice in C# .net to jasperserver
我正在使用 ServiceStack.ServiceClient.Web.XmlServiceClient 连接到 Web 服务。有没有办法在请求中添加附件?
更多信息:
我想要做的是避免使用 Microsoft.Web.Services2,因为我使用的是 Mono。我正在尝试上传 XML 数据文件以及 XML 请求。就像在这个问题中一样: Upload report unit via webservice in C# .net to jasperserver
上传文件最好(也是最快)的方法是不将其编码为普通请求变量,而只需将其作为普通 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
还包括每个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),
});
}