2016-02-17 21 views
0

我想要利用Response.WriteFile()向客户机发送文件,但是当我在控制器内部实现它时,我的return View()不再返回View。我的猜测是,响应已经对请求做出响应。你将如何利用Response.WriteFile(),以便它返回文件,但我仍然可以返回我的视图?我想过使用StreamWriter但路径需要根据用户的浏览器是什么设置为。有什么建议么?这样做的目的是测试给定用户下载文件所需的时间,连接测试。在控制器中使用Response.WriteFile()

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

你可以创建一个返回'FileResult'一个新的动作,并从链接在你的'DownloadTest'查看调用此 – markpsmith

回答

0

每个控制器方法调用对应一个逻辑HTTP请求和响应。你不能以同样的请求响应的两倍,所以一旦文件被发送的响应可能是考虑后由控制器忽略返回的ActionResult。一旦你打电话HttpResponse.Write()或任何这样的功能,服务器逻辑上必须发送所有HTTP头。如果ActionResult得到尊重不知何故,我想象中的客户端浏览器会下载您写了HttpResponse.WriteFile()与上涨到年底,串联式的,而不是你似乎想在浏览器中显示你的HTML视图中的文件。

为了得到你想要的那种行为,你必须在客户端进行多次请求。例如,使用AJAX管理文件的下载或通过在iframe中访问文件。