Вот часть моего кода:
Код: Выделить всё
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;
Код: Выделить всё
const newWindow = window.open('', '_blank');
newWindow.location.href = url;
Вещи, которые я пробовал или о которых слышал:
- Я читал о 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