ServiceStack客户端添加附件

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

更多信息:

我想要做的是避免使用Microsoft.Web.Services2,因为我使用的是Mono。 我正在尝试上传XML数据文件以及XML请求。 就像这个问题一样: 通过C#.net中的webservice将报表单元上传到jasperserver

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

ServiceStack内置支持以这种方式处理上传文件,其中有一个完整的示例,说明如何在ServiceStack的RestFiles示例项目中执行此操作。

要使用ServiceClient上载文件,您可以使用此示例中显示的.PostFile ()方法:

var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt"); var response = restClient.PostFile(WebServiceHostUrl + "files/README.txt", fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name)); 

所有上传的文件都可以通过base.RequestContext.Files集合获得,您可以使用SaveTo()方法 (作为Stream或文件) 轻松处理 。

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

多个文件上传

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

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

仅使用类型化请求DTO的示例。 JsonHttpClient还包含每个PostFilesWithRequest API的异步等效PostFilesWithRequest

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