我想利用Response.WriteFile()
将文件发送到客户端计算机,但是当我在控制器中实现它时,我的return View()
不再返回View。我的猜测是响应已经响应了请求。你如何利用Response.WriteFile()
以便它返回文件,但我仍然可以返回我的视图?我考虑过使用StreamWriter
,但路径需要基于用户浏览器的设置。有什么建议?这样做的目的是测试给定用户下载文件所需的时间,连接测试。
public ActionResult DownloadTest()
{
SpeedTest Test = new SpeedTest();
Services.IPAddress ip = new Services.IPAddress();
var clientIP = ip.GetIPAddress();
string[] IPAddresses = clientIP.Split(':');
Test.Address = IPAddresses[0];
double speed = 0.00;
try
{
double fileSize = 2.67; //Size of File in MB.
DateTime startTime = DateTime.Now;
//Response.ContentType = "image/JPEG";
//Response.AddHeader("Content-Disposition", "attachment;filename=DownloadTest.jpg");
//Response.WriteFile(Server.MapPath("~/TestFile/2point67mb.jpg"));
DateTime endTime = DateTime.Now;
speed = Math.Round((fileSize / (endTime - startTime).TotalSeconds));
Test.ResponseTime = string.Format("{0} Mbps", speed);
Test.Status = "Success";
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
db.SpeedTest.Add(Test);
db.SaveChanges();
}
catch
{
Test.ResponseTime = "N/A";
Test.Status = "Failed";
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
db.SpeedTest.Add(Test);
db.SaveChanges();
}
return View(Test);
}
答案 0 :(得分:0)
每个控制器方法调用对应一个逻辑HTTP请求和响应。您无法对同一请求做出两次响应,因此一旦发送文件,响应可能会被视为已完成,并且您的控制器返回的FILE*
将被忽略。一旦调用ActionResult
或类似的任何函数,服务器在逻辑上必须发送所有HTTP头。如果以某种方式尊重HttpResponse.Write()
,我想客户端浏览器会下载您使用ActionResult
编写的文件,并将HTML视图添加到最后,串联样式,而不是比您在浏览器中显示的要好。
要获得所需的行为,您必须让客户端发出多个请求。例如,使用AJAX管理文件下载或在iframe中访问它。