我的解决方案有两个项目,一个是ASP.NET MVC(仅限UI),另一个是ASP.NET Web API(作为Restful服务)。我想将上传的文件从MVC项目发送到Web API,在部署时,每个应用程序将托管在不同的服务器上,因此我需要将所有文件集中在Web API服务器中。我需要帮助来比较两个选项(性能方面):
[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();
}
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;
}
System.IO.File.Copy("sourcePath in MVC server", "\\machinename\share folder path");
最佳表现是什么?
答案 0 :(得分:3)
在选项1中,您要上载文件两次:从客户端到托管MVC应用程序的服务器,然后从那里到您的Web API。
在选项2中,只有在上传方面表现最佳,因为您直接从客户端调用Web Api。
但一如既往,这取决于你想要达到的目标。
您应该使用浏览器(firefox或chrome)分析器来比较每个选项所用的时间。
每当您对性能产生怀疑时,您都应该对应用程序进行分析。还要记住,性能是一个功能。
您可以将此工具用于不同的分析案例[1]:
发现代码中的热点
在代码中发现分配
两者兼顾
隔离功能并迭代改进
答案 1 :(得分:3)
我怀疑具有直接文件访问权限的选项2应该提供更好的性能,因为所使用的协议针对传输二进制文件进行了优化,而HTTP协议用于不同的目的。
但是,性能不应该是选择解决方案的唯一标准。如果您在选项之间进行选择,则还需要评估其他含义。
从架构和安全的角度来看,选项2比选项1更差,因为:
出于这些原因,只要性能足以满足您的要求,我就会选择选项1。
作为替代方案,您还可以直接将文件从客户端上传到Web API,从而减少您必须执行的上传次数。