У меня есть приложение MVC, в котором есть действие, которое служит файлу. У меня есть требование, чтобы, если пользователь инициировал загрузку, пользователь не может инициировать новую загрузку до окончания текущей.Определить существующий Загрузить в MVC C# для приложения
Просто попробуйте скачать только один файл за один раз. Однако я не хочу просто блокировать запрос пользователя, но хочу сообщить им, что они не могут загрузить новый, поскольку они загружают существующий.
Так что мой вопрос: как вы отслеживаете, когда загрузка была запущена и еще не закончена? Первоначально я переключился на динамическое ограничение IP-адресов в IIS, но проблема заключается в том, что конечный пользователь может сидеть за слоями на слоях прокси-серверов, которые не могут сделать его надежным. Есть ли способ сделать это с помощью кода?
Я также попытался использовать 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;
}
}
*********************** Обновление ******************* **
Я обновил образец кода. Загрузить можно вызывать любое количество времени для загрузки файла в c: \ temp, а затем при загрузке я пытался вызвать CheckStatus, но он не отвечает во время загрузки. Только после завершения загрузки.
Здесь я добавил проектное решение. https://github.com/janmchan/DownloadThrottling.git
*********************** Обновление 2016-04-04 **********
После немного поиска я узнал, что сессия (я использую SQLServer) сохраняется в конце запроса, так что даже если пользователь управляет двумя параллельными запросами, переменная сеанса не будет обновляться до конца запроса, создающего информация в сеансе не надежна. Итак, теперь я ищу способ вручную принудительно сохранить состояние сеанса сразу после обновления значения.
Сессия не будет работать для вас, поскольку сеанс специфичен для браузера (т. Е. Он основан на cookie, и каждый браузер обрабатывает файлы cookie по-разному). Поэтому (как я упоминаю в другом месте) все, что вам нужно сделать, это открыть другой браузер, чтобы обойти любую безопасность сеанса. Однако, если вы хотите использовать сеанс, вам нужно только установить флаг сеанса, а затем перенаправить браузер в загружаемый файл, это обеспечит обновление переменной сеанса до начала загрузки. –
Вы также хотели бы объединить это с уникальным идентификатором загрузки, который генерируется «на лету», чтобы обратиться к определенному файлу, а затем, когда начинается загрузка, вы помечаете его в базе данных, как загружено для этого идентификатора, и не позволяете ему снова использоваться. –