Веб-API C# ASP.NET в .NET 4.8 - асинхронность с «вложением» Content-Disposition по-прежнему блокирует контекст пользоватC#

Место общения программистов C#
Anonymous
Веб-API C# ASP.NET в .NET 4.8 - асинхронность с «вложением» Content-Disposition по-прежнему блокирует контекст пользоват

Сообщение Anonymous »

У меня есть асинхронный метод веб-API ASP.NET, который загружает файл с использованием «вложения» размещения содержимого. Все ожидаемые методы украшены .ConfigureAwait(false) внутри и снаружи.
Вот часть моего кода:

Код: Выделить всё

string contentType = null;
long length = 0;

using (var blobStream = await ProcessBlobStreamAsync(reqModel, (cType, len) =>
{
contentType = cType;
length = len;
}, cancellationToken).ConfigureAwait(false))
{
resp.Content = new StreamContent(blobStream);
resp.Headers.AcceptRanges.Add("bytes");
resp.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName
};
resp.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
resp.Content.Headers.ContentLength = length;
resp.Headers.TransferEncodingChunked = true;
}
return resp;
У меня есть Javascript, который открывает новую вкладку и загружает данные с помощью моего асинхронного метода веб-API:

Код: Выделить всё

const newWindow = window.open('', '_blank');
newWindow.location.href = url;
Даже если он находится на другой вкладке — стреляйте, даже если я загружаю его в iframe — когда я пытаюсь перейти в другое место в своем основном приложении ASP.NET MVC, пока файл находится При загрузке приложение MVC зависает и ждет завершения загрузки, хотя метод веб-API уже давно вернул ответ 200. Ответ 200 возвращается сразу же, а затем начинается загрузка. На вкладке «Сеть» браузера нет никаких указаний на то, что происходит что-то еще.
Вещи, которые я пробовал или о которых слышал:
  • Я читал о SynchronizationContext и о том, что, возможно, несмотря ни на что, ASP.NET позволит мне иметь только один исполняемый метод одновременно - но это кажется безумием. Должно быть, я неправильно это понимаю.
  • Я также читал, что если вы украсите свой метод любым AuthorizeAttribute, вы принудительно выполнить синхронную обработку, даже если вы этого не планировали, поэтому [только для тестирования] я удалил все это, но это все равно происходит.

    < li>Я также читал, что это проблема только с HTTP/1.1 и что HTTP/2 должен работать, но я использую HTTP/2, и это все равно происходит.
  • Я экспериментировал с использованием функции Javascript fetch вместо открытия новой вкладки, но пользовательский опыт оказался плохим; вместо отображения загрузки в разделе загрузки браузера на вкладке сети остается открытым секретное тихое соединение, которое пользователь не видит, а контекст пользовательского интерфейса по-прежнему блокируется.
  • Я также читал, что любое событие IoC может быть заблокировано, если в ваш класс внедряются какие-либо одноэлементные экземпляры, поэтому я позаботился о том, чтобы каждый объект, внедренный в мой ApiController, был уникальный для каждого запроса. Контекст пользовательского интерфейса по-прежнему заблокирован.
  • Для проверки работоспособности я открыл другой браузер и вошел в систему, просто чтобы убедиться, что На моем сервере возникла какая-то проблема с ресурсами. Не было; Я мог нормально войти в систему и перемещаться по совершенно другому браузеру - пока я не попробовал загрузить туда файл, а затем этот браузер тоже завис.
  • Я попытался перенаправить загрузку файла, чтобы сделать запрос GET на файл «вложения» Content Disposition с совершенно другого веб-сайта; это сработало нормально, но это не мой веб-сайт!
  • Я приостановил работу отладчика на время загрузки файла, и Visual Studio предлагает отказаться в данный момент выполняется код.
  • Вместо открытия в новой вкладке я попытался открыть загрузку в iframe (как уже упоминалось выше); файл загружается нормально, но контекст пользовательского интерфейса по-прежнему заблокирован.
Действительно ли это то, что невозможно обойти? Пользователи с неисправным подключением могут потратить целый час на загрузку файла. Действительно ли нет способа разблокировать контекст пользовательского интерфейса в течение этого времени?
Разблокировка потока пользовательского интерфейса была единственной причиной, по которой я использовал расположение контента «вложение» и в первую очередь открыл его в новой вкладке. .

Подробнее здесь: https://stackoverflow.com/questions/790 ... attachment

Вернуться в «C#»