Skip to main content
 首页 » 编程设计

c#之从 MVC 应用程序发送文件到 Web API 性能

2024年01月22日27lori

我的解决方案有两个项目,一个是 ASP.NET MVC(仅作为 UI),另一个是 ASP.NET Web API(作为 Restful 服务)。我想将上传的文件从 MVC 项目发送到 Web API,并且在部署时每个应用程序都将托管在不同的服务器上,因此我需要将所有文件集中在 Web API 服务器中。我需要帮助来比较两个选项(性能方面):

1- 将上传的文件从 MVC 操作发送到 Web API Post 操作,如下所示:

在 MVC 项目中:

    [HttpPost] 
    public ActionResult UploadProfilePicture(HttpPostedFileBase file) 
    { 
        using (var client = new HttpClient()) 
        { 
            using (var content = new MultipartFormDataContent()) 
            { 
                byte[] Bytes = new byte[file.InputStream.Length + 1]; 
                file.InputStream.Read(Bytes, 0, Bytes.Length); 
                var fileContent = new ByteArrayContent(Bytes); 
                fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = file.FileName }; 
                content.Add(fileContent); 
                var requestUri = "http://localhost:1963/api/upload"; 
                var result = client.PostAsync(requestUri, content).Result; 
                if (result.StatusCode == System.Net.HttpStatusCode.Created) 
                { 
                    List<string> m = result.Content.ReadAsAsync<List<string>>().Result; 
                    ViewBag.Success = m.FirstOrDefault(); 
 
                } 
                else 
                { 
                    ViewBag.Failed = "Failed !" + result.Content.ToString(); 
                } 
            } 
        } 
        return View(); 
    } 

在 Web API 项目中:

    public HttpResponseMessage Post() 
    { 
        HttpResponseMessage result = null; 
        var httpRequest = HttpContext.Current.Request; 
        if (httpRequest.Files.Count > 0) 
        { 
            var docfiles = new List<string>(); 
            foreach (string file in httpRequest.Files) 
            { 
                var postedFile = httpRequest.Files[file]; 
                var filePath = HttpContext.Current.Server.MapPath("~/" + postedFile.FileName); 
                postedFile.SaveAs(filePath); 
                docfiles.Add(filePath); 
            } 
            result = Request.CreateResponse(HttpStatusCode.Created, docfiles); 
        } 
        else 
        { 
            result = Request.CreateResponse(HttpStatusCode.BadRequest); 
        } 
        return result; 
    } 

2- 将上传的文件从 MVC 操作发送到 Web API 服务器,如下所示:

System.IO.File.Copy("sourcePath in MVC server", "\\machinename\share folder path"); 

什么是最好的表现?

请您参考如下方法:

我怀疑带有直接文件访问的选项 2 应该提供更好的性能,因为所使用的协议(protocol)针对传输二进制文件进行了优化,而 HTTP 协议(protocol)用于不同的目的。

但是,性能不应成为选择解决方案的唯一标准。如果您在这些选项之间做出选择,您还需要评估其他影响。

从架构和安全的角度来看,选项 2 比选项 1 更差,因为:

  • 应用程序的两个部分的耦合更紧密。例如:在稍后的某个时间点,您可能决定不将文件存储在文件系统中,而是存储在云存储中。对于选项 2,您必须同时更改 MVC 应用程序和 Web API。对于选项 1,仅 Web API 的内部工作原理。
  • 此外,您始终必须在 MVC 服务器可以通过文件访问协议(protocol)访问 Web API 服务器的环境中运行应用程序。这需要对系统进行大量控制,并且在某些环境中您对系统没有那么多控制(例如云 PaaS)。这些环境现在可能不相关,但将来可能相关。
  • 在安全方面,您必须允许 MVC 应用程序写入 Web API 服务器的共享。可以肯定的是,您已经保护您的 Web API 免受未经授权的访问。对于选项 2,您需要为您的应用程序打开另一扇门。这会增加受到攻击的风险以及部署应用程序所需的工作量。

出于这些原因,只要性能足以满足您的要求,我就会选择选项 1。

作为替代方案,您也可以将文件从客户端直接上传到 Web API,从而减少您必须执行的上传次数。