在ASP.NET MVC中将文件从Controller发送到远程ApiController的通用且有效的方法

时间:2016-07-05 09:05:06

标签: c# asp.net-mvc rest asp.net-mvc-5

我正在开发一个多级ASP.NET MVC Web平台,我需要将文件从System.Web.Mvc.Controller发送到ASP.NET MVC Web服务的System.Web.Http.ApiController,远程运行在另一台机器上。

目前,我在Mvc.Controller

中有这个
public ActionResult ForwardThisFile(HttpPostedFileBase file)
{
    // TODO: Forward file to remote DocumentApi:
    DocumentApi.DocumentApiClient client = new DocumentApi.DocumentApiClient();
    client.StoreDocument(file /* <-- How-To? */);
    return View();
}

其中DocumentApiClient已通过Visual Studio的添加REST API客户端... 函数从Swagger URL生成。 (生成的客户端内部使用依赖Microsoft.Rest.ClientRuntimeSystem.Net.Http.HttpClient等的HttpRequestMessage

问题是,我如何定义和实现DocumentApi,以便在ApiController中以高效通用的方式将文件传输给它。目前,我正在考虑三种不同的选择:

  • [HttpPut] public async Task<IHttpActionResult> StoreDocument(HttpPostedFileBase file)
  • [HttpPut] public async Task<IHttpActionResult> StoreDocument(byte[] fileContents, string contentType, string fileName)
  • [HttpPut] public async Task<IHttpActionResult> StoreDocument(Stream fileStream, string contentType, string fileName)

我在想,也许我可以将HttpPostedFileBase实例从Mvc.Controller转发到ApiController,所以我尝试了第一个选项。但是,在这种情况下,添加REST API客户端... 会创建一个DocumentApi.Models.HttpPostedFileBase模型类,而不是原始类型System.Web.HttpPostedFileBase。现在,我不确定我应该做什么......

new DocumentApi.Models.HttpPostedFileBase() {
    InputStream = file.InputStream,
    ContentType = file.ContentType,
    ContentLength = file.ContentLength,
    FileName = file.FileName,
}

^不起作用,因为对于InputStream,它会创建一个DocumentApi.Models.Stream类,我不知道如何从System.IO.Stream参数转换file进入DocumentApi.Models.Stream

甚至可以跨ASP.NET MVC webservices发送流吗? (这基本上是选项3的答案)

在我目前的知识状态中,唯一的替代选择在我看来是选项2,在那里我将发送一个包含整个文件的字节数组。但是,我问自己,是否有更方便或更有效的方式将文件从Mvc.Controller发送到远程ApiController。有吗?
哪一个选项可行,哪一个是可行的方法?

此外,我对上述HttpPostedFileBase有一个加分问题:通过HttpPostedFileBase处理ASP.NET MVC中上传文件的最有效方法是什么?我见过各种替代方案:

  • HttpPostedFileBase如上面第一个代码示例所示
  • 通过Request.Content.ReadAsStreamAsync()或类似的东西使用原始HTTP请求。也许这个流对我的用例更有效?
  • 使用JavaScript将文件编码为Base64字符串,并通过隐藏的输入字段将其发送到控制器。 (通过FileReader的方法readAsDataURL(file)

这么多选项......哪一个最好/最通用/最有效?

1 个答案:

答案 0 :(得分:0)

您应该使用调用控制器中的HttpClient lib来异步将文件上载到目标控制器。使用HttpClient进行asycn上传的各种示例都在C# HttpClient 4.5 multipart/form-data upload

在这种情况下,您的接收遥控器就像是从浏览器上传文件而不需要特定处理。