ASP.NET MVC中的返回文件的多重操作

时间:2012-10-27 06:23:13

标签: asp.net-mvc

在我的一个Action s

中假设此代码
[HttpPost]
public ActionResult Generate (Params){

....

InsertOneRawToDB();
return RedirectToAction("Index", new { info = info });

}

因此,当我将return更改为:

时,每件事情都可以
InsertOneRawToDB();
byte[] myfile = GenerateAZipFile();
return File( myfile , "application/zip" , "MyFileName");

在这种情况下,我看到一个奇怪的行为:在返回之前,一个raw插入到DB,并在返回另一个raw插入后,似乎再次调用InsertOneRawToDB

有人知道吗?这里发生了什么?

PS:我使用Visual Studio 2012 RTM + ASP.NET MVC4

PS:好的我使用IDM(互联网下载管理器)下载zip文件,导致MultiPost Action这样我该如何处理?

2 个答案:

答案 0 :(得分:1)

根据您的结论,问题与使用下载管理器有关......这就是下载经理所做的事情。它们创建了与文件的多个连接。

您可以做的一件事是存储一个会话变量,说明“已经开始下载”,然后只在第一次插入记录。

但是,如果用户合法地多次下载文件,那么您只能获得一条记录。

另一种选择是检查Http标头并查找“Range”标头,该标头用于下载多个文件(或恢复文件)。然后,您必须获取Range参数,并仅返回所请求文件的部分。

以下是如何进行远程下载的示例:http://tpeczek.com/2011/10/range-requests-in-aspnet-mvc.html

我真的很惊讶之前没有出现过......我想大多数人都不会在下载操作中执行数据库操作或注意它。

答案 1 :(得分:0)

您可以重定向到新操作和此新操作返回文件。

[HttpPost]
public ActionResult Generate (Params){

    ....

    InsertOneRawToDB();
    return RedirectToAction("GetFile"};

}
[HttpGet]
public ActionResult GetFile
{
    byte[] myfile = GenerateAZipFile();
    return File(myfile, "application/zip", "filename.ext");
}