ファイルを処理するアクションを持つMVCアプリケーションがあります。ユーザーがダウンロードを開始した場合、現在のユーザーがダウンロードを完了するまで、ユーザーは新しいダウンロードを開始できないという要件があります。既存アプリケーションのMVC c#でのダウンロード
単純に言えば、ユーザーは一度に1つのファイルしかダウンロードできません。しかし、私は単にユーザーの要求をブロックしたいのではなく、既存のものをダウンロードしているため、新しいものをダウンロードできないことを知らせたいと思っています。
私の質問は、ダウンロードが開始されてまだ完了していないときにどのように追跡していますか?私は最初IISの動的IP制限に目を向けましたが、問題はエンドユーザーが信頼できるものではないかもしれないプロキシの層にレイヤーの背後に座っている可能性があることです。コードでこれを行う方法はありますか?
また、進行中のストリームを作成するFileWebRequest/FileWebResponseを使ってみました。しかし、新しいリクエストが入ったときに新しいアクションとして入力され、前のストリームがまだ進行中かどうかを確認する方法はわかりません。
public async Task<ActionResult> Download()
{
Session["IsDownloading"] = true;
await ServeFiles();
return View("Index");
}
public ActionResult CheckStatus()
{
var message = Session["IsDownloading"] ?? "Null";
return Content(message.ToString());
}
private async Task ServeFiles()
{
try
{ //Download async
}
finaly
{
Session["IsDownloading"] = false;
}
}
***********************更新******************* **
サンプルコードを更新しました。 ダウンロードは、ダウンロードしている間に、CheckStatusを呼び出そうとしていましたが、ダウンロードが進行中に応答しません。ダウンロードが完了したときのみ。
私はここにプロジェクトソリューションを追加しました。 https://github.com/janmchan/DownloadThrottling.git
***********************アップデート2016年4月4日**********
後私はそのセッション(私はSQLServerを使用していることがわかった)の検索のビットがリクエストの最後に保存されるので、ユーザーが2つの同時リクエストを管理しても、セッション変数はリクエストの最後まで更新されませんセッションの情報は信頼できません。だから今、値を更新した直後に手動でセッション状態を保存する方法を探しています。
セッションはブラウザ固有のものです(つまり、Cookieベースであり、各ブラウザがCookieを別々に処理するため)。だから(別のところで言及したように)セッションセキュリティをバイパスするために別のブラウザを開くだけで済ませなければならない。ただし、セッションを使用する場合は、セッションフラグを設定してからダウンロードするファイルにブラウザをリダイレクトするだけで済みます。これにより、ダウンロードが開始される前にセッション変数が更新されます。 –
また、特定のファイルを参照するためにオンザフライで生成された一意のダウンロードIDと組み合わせることもできます。ダウンロードが開始されると、そのIDのダウンロード時にデータベースにマークし、再度使用されないようにします。 –