0

Action私の s の1 つでこのコードを仮定します。

[HttpPost]
public ActionResult Generate (Params){

....

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

}

したがって、すべてはまだ問題ありませんが、次のように変更returnすると:

InsertOneRawToDB();
byte[] myfile = GenerateAZipFile();
return File( myfile , "application/zip" , "MyFileName");

この場合、奇妙な動作が見られます: 戻る前に、1 つの raw が DB に挿入され、返された後に別の raw が挿入され、InsertOneRawToDB再度呼び出されたようです。

誰もこれについて知っていますか?ここで何が起こっているのですか?

PS: Visual Studio 2012 RTM + ASP.NET MVC4 を使用しています。

PS: OK IDM (Internet Download Manager) を使用して zip ファイルをダウンロードすると、これで MultiPost が発生するActionので、どうすればこれを処理できますか?

4

2 に答える 2

1

問題はダウンロードマネージャーの使用に関連しているというあなたの結論に基づいて...それはダウンロードマネージャーが行うことです。ファイルへの複数の接続を作成します。

あなたができることの1つは、「すでにダウンロードを開始しました」というセッション変数を保存し、最初にレコードを挿入することだけです。

ただし、ユーザーが合法的にファイルを複数回ダウンロードした場合、取得できるレコードは 1 つだけです。

もう 1 つのオプションは、Http ヘッダーを調べて、ファイルを複数の部分に分けてダウンロードする (またはファイルを再開する) ために使用される "Range" ヘッダーを探すことです。次に、Range パラメーターを取得して、要求されたファイルの部分のみを返す必要があります。

Ranged ダウンロードを行う方法の例を次に示します: 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 に答える