我的解决方案有两个项目,一个是 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,从而减少您必须执行的上传次数。
