在我的一个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
这样我该如何处理?
答案 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");
}