0

假设此代码在我Action的一个

[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(Internet 下载管理器)下载 zip 文件,这会导致 MultiPost 出现在此问题上,Action那么我该如何处理呢?

4

2 回答 2

1

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

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

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

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

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

实际上,我很惊讶以前没有出现过这种情况……我想大多数人不会在下载操作中执行数据库操作或注意到它。

于 2012-10-27T18:30:34.600 回答
0

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

[HttpPost]
public ActionResult Generate (Params){

    ....

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

}
[HttpGet]
public ActionResult GetFile
{
    byte[] myfile = GenerateAZipFile();
    return File(myfile, "application/zip", "filename.ext");
}
于 2012-10-27T09:32:07.957 回答