Веб-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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • ASP.Net Core Content-Disposition вложение/встроенное
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • ASP.Net Core Content-Disposition вложение/встроенное
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • ASP.Net Core Content-Disposition вложение/встроенное
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • .Net Core 8 – загрузить файл, у клиента нет заголовка Content-Disposition
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • .NET Core 8 – загрузить файл, у клиента нет заголовка Content-Disposition
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

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