将文件从MVC应用程序发送到Web API性能

时间:2017-12-14 07:44:41

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

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

答案 0 :(得分:3)

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

在选项2中,只有在上传方面表现最佳,因为您直接从客户端调用Web Api。

但一如既往,这取决于你想要达到的目标。

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

每当您对性能产生怀疑时,您都应该对应用程序进行分析。还要记住,性能是一个功能。

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

发现代码中的热点

在代码中发现分配

两者兼顾

  • Performance Explorer(Visual Studio)
  • PerfView(观看有关如何使用的频道9视频!)

隔离功能并迭代改进

[1] Tooling proposed by Ben Adams

答案 1 :(得分:3)

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

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

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

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

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

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