在Controller中使用Response.WriteFile()

时间:2016-02-17 17:04:13

标签: c# asp.net-mvc response.write

我想利用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);
    }

1 个答案:

答案 0 :(得分:0)

每个控制器方法调用对应一个逻辑HTTP请求和响应。您无法对同一请求做出两次响应,因此一旦发送文件,响应可能会被视为已完成,并且您的控制器返回的FILE*将被忽略。一旦调用ActionResult或类似的任何函数,服务器在逻辑上必须发送所有HTTP头。如果以某种方式尊重HttpResponse.Write() ,我想客户端浏览器会下载您使用ActionResult编写的文件,并将HTML视图添加到最后,串联样式,而不是比您在浏览器中显示的要好。

要获得所需的行为,您必须让客户端发出多个请求。例如,使用AJAX管理文件下载或在iframe中访问它。