#c# #asp.net #http #iis-7
#c# #asp.net #http #iis-7
Вопрос:
У меня есть веб-сайт, который позволяет пользователям загружать файлы, нажимая ссылки href, которые будут вызывать HTTP-запрос GET и возвращать файл (будет запрашивать пользователя в IE и автоматически загружать в Chrome)
public async Task<IActionResult> DownloadFile(DocumentFile file){
fileName = DocumentTask.RetrieveFiles(new string[1] { file.FileID }, file.Facility, UserData.Access).SingleOrDefault();
if (System.IO.File.Exists(fileName))
{
FileInfo info = new FileInfo(fileName);
return File(System.IO.File.ReadAllBytes(fileName), FileUtility.GetContentType(fileName), info.Name);
}
}
Когда пользователь нажимает на ссылку для скачивания:
<a href="/File/DownloadFile?FileUID=1111amp;amp;Facility=TestFacilityamp;amp;Name=TestFile.pdf"><i class="file pdf outline icon"></i>TestFile.pdf</a>
и затем сразу после нажатия на другую ссылку для загрузки (до того, как первая ссылка для загрузки вернет ответ), кажется, что клиент закрывает соединение с первым запросом. Это выдаст эту ошибку:
Удаленный хост закрыл соединение. Код ошибки 0x800703E3.
Эта ошибка возникает, когда сервер пытается вернуть файл обратно пользователю, но не может, поскольку соединение было закрыто.
Используя инструменты разработчика Chrome, я вижу, что оба запроса попадают в очередь, однако, как только отправляется второй запрос, он отменяет первый запрос (закрывает соединение).
Запрос разработчика Chrome отменен
Прямо сейчас я запретил пользователю переходить по другой ссылке для скачивания, пока не будет возвращен предыдущий запрос, однако я хотел бы знать, есть ли более элегантное решение, позволяющее отправлять и ожидать несколько запросов?
(Я тестировал это в Chrome и IE 11, и оба отменяют отправленный предыдущий запрос)
Заранее спасибо.
Комментарии:
1. ваш клиент повторно использует один и тот же объект (XMLHttpRequest)? если вы это сделаете, проблема в том, что вы фактически отбрасываете предыдущий запрос. Если я ошибаюсь, было бы неплохо просмотреть код вашего клиента
2. @Ronny-Barrera Пожалуйста, смотрите Мою правку выше для кода клиента, это просто ссылка Href, которая вызывает метод контроллера для возврата файла клиенту. Он не использует XMLHttpRequest. Запросы отправляются как запросы типа документа.
3. Боюсь, у меня не было времени попробовать это раньше, но разве это не помогло бы, если бы вы просто добавили свой файл или жесткую ссылку на него в свою папку, чтобы вы могли обойти запрос на обслуживание?
4. @Ronny-Barrera Мой веб-сайт используется для поиска файлов, и в базе данных около 2 миллионов файлов, поэтому, к сожалению, мне приходится вызывать службу, которая захватит файл для пользователя. Просто кажется странным, что клиент не будет поддерживать два соединения запросов открытыми одновременно.
Ответ №1:
Возможно, вы могли бы использовать функцию с формой следующего, чтобы достичь своей цели, я протестировал ее, и она не перестает получать файлы, дайте мне знать, если это работает для вас:
public Stream Downloadfile(string filename)
{
WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = "attachment; filename=" filename;
WebOperationContext.Current.OutgoingResponse.ContentType = "application/octet-stream";
return File.OpenRead(filename);
}
Комментарии:
1. Позвольте мне уточнить. Проблема отсутствует на стороне сервера. Серверный код работает без проблем, однако, когда он пытается вернуть файл обратно пользователю, соединение больше не доступно, поскольку соединение было «отменено» на стороне клиента. Мне интересно, существует ли параметр, который останавливает одновременную активность нескольких подключений к запросу.
Ответ №2:
Я не смог найти ответ на свое решение. Однако я смог изменить способ работы моих ссылок. При изменении ссылки target=»_blank» откроется новая страница и закроется, когда начнется загрузка файла. Это останавливает пользователя от выбора второй ссылки до тех пор, пока не вернется другая, но также, если они используют среднюю кнопку мыши, чтобы открыть ссылку, но не изменить фокус вкладки, это останавливает возникновение ошибки. Я думаю, что проблема заключалась в нескольких запросах с одной и той же вкладки.