【问题标题】:Sending file from MVC application to Web API performance将文件从 MVC 应用程序发送到 Web API 性能
【发布时间】:2017-12-16 00:21:54
【问题描述】:

我的解决方案有两个项目,一个是 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");

什么是最好的表现?

【问题讨论】:

  • 看起来你已经尝试了这两种方法。哪个更快?

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    在选项 1 中,您将文件上传两次:从客户端到托管它的 MVC 应用程序的服务器,然后从那里到您的 Web API。

    选项 2 似乎仅在上传方面性能最佳,因为您直接从客户端调用 Web Api。

    但一如既往,这取决于您想要实现的目标。

    您应该使用浏览器(firefox 或 chrome)分析器来比较每个选项所花费的时间。

    当您对性能有疑问时,您应该分析您的应用程序。还要记住,性能是一种特性。

    您可以将此工具用于不同的分析案例 [1]:

    发现代码中的热点

    发现代码中的分配

    两者都做

    • 性能资源管理器 (Visual Studio)
    • PerfView(观看第9频道的视频了解如何使用!)

    隔离一个函数并迭代改进

    [1]Tooling proposed by Ben Adams

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多