У меня есть асинхронный метод веб-API ASP.NET, который загружает файл с использованием «вложения» размещения содержимого. Все ожидаемые методы украшены .ConfigureAwait(false) внутри и снаружи.
Вот часть моего кода:
Даже если он находится на другой вкладке — стреляйте, даже если я загружаю его в 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 (как уже упоминалось выше); файл загружается нормально, но контекст пользовательского интерфейса по-прежнему заблокирован.
Действительно ли это то, что невозможно обойти? Пользователи с неисправным подключением могут потратить целый час на загрузку файла. Действительно ли нет способа разблокировать контекст пользовательского интерфейса в течение этого времени?
Разблокировка потока пользовательского интерфейса была единственной причиной, по которой я использовал расположение контента «вложение» и в первую очередь открыл его в новой вкладке. .
У меня есть асинхронный метод веб-API ASP.NET, который загружает файл с использованием «вложения» размещения содержимого. Все ожидаемые методы украшены .ConfigureAwait(false) внутри и снаружи. Вот часть моего кода: [code]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; [/code] У меня есть Javascript, который открывает новую вкладку и загружает данные с помощью моего асинхронного метода веб-API: [code]const newWindow = window.open('', '_blank'); newWindow.location.href = url; [/code] Даже если он находится на другой вкладке — стреляйте, даже если я загружаю его в iframe — когда я пытаюсь перейти в другое место в своем основном приложении ASP.NET MVC, пока файл находится При загрузке приложение MVC зависает и ждет завершения загрузки, хотя метод веб-API уже давно вернул ответ 200. Ответ 200 возвращается сразу же, а затем начинается загрузка. На вкладке «Сеть» браузера нет никаких указаний на то, что происходит что-то еще. Вещи, которые я пробовал или о которых слышал: [list] [*]Я читал о SynchronizationContext и о том, что, возможно, несмотря ни на что, ASP.NET позволит мне иметь только один исполняемый метод одновременно - но это кажется безумием. Должно быть, я неправильно это понимаю.
[*]Я также читал, что если вы украсите свой метод любым AuthorizeAttribute, вы принудительно выполнить синхронную обработку, даже если вы этого не планировали, поэтому [только для тестирования] я удалил все это, но это все равно происходит.
< li>Я также читал, что это проблема только с HTTP/1.1 и что HTTP/2 должен работать, но я использую HTTP/2, и это все равно происходит.
[*]Я экспериментировал с использованием функции Javascript fetch вместо открытия новой вкладки, но пользовательский опыт оказался плохим; вместо отображения загрузки в разделе загрузки браузера на вкладке сети остается открытым секретное тихое соединение, которое пользователь не видит, а контекст пользовательского интерфейса по-прежнему блокируется.
[*]Я также читал, что любое событие IoC может быть заблокировано, если в ваш класс внедряются какие-либо одноэлементные экземпляры, поэтому я позаботился о том, чтобы каждый объект, внедренный в мой ApiController, был уникальный для каждого запроса. Контекст пользовательского интерфейса по-прежнему заблокирован.
[*]Для проверки работоспособности я открыл другой браузер и вошел в систему, просто чтобы убедиться, что На моем сервере возникла какая-то проблема с ресурсами. Не было; Я мог нормально войти в систему и перемещаться по совершенно другому браузеру - пока я не попробовал загрузить туда файл, а затем этот браузер тоже завис.
[*]Я попытался перенаправить загрузку файла, чтобы сделать запрос GET на файл «вложения» Content Disposition с совершенно другого веб-сайта; это сработало нормально, но это не мой веб-сайт!
[*]Я приостановил работу отладчика на время загрузки файла, и Visual Studio предлагает отказаться в данный момент выполняется код.
[*]Вместо открытия в новой вкладке я попытался открыть загрузку в iframe (как уже упоминалось выше); файл загружается нормально, но контекст пользовательского интерфейса по-прежнему заблокирован.
[/list] Действительно ли это то, что невозможно обойти? Пользователи с неисправным подключением могут потратить целый час на загрузку файла. Действительно ли нет способа разблокировать контекст пользовательского интерфейса в течение этого времени? Разблокировка потока пользовательского интерфейса была единственной причиной, по которой я использовал расположение контента «вложение» и в первую очередь открыл его в новой вкладке. .
У меня есть простое приложение для загрузки/выгрузки файлов с клиентом в Blazor и сервером в качестве API .Net 8. Я установил Content-Disposition в API с помощью этого кода:
public async Task Get(string fileName)
{
var memoryStream = new...
У меня есть простое приложение для загрузки и скачивания файлов с клиентом в Blazor и сервером в качестве веб-API ASP.NET Core 8. Я установил Content-Disposition в API с помощью этого кода:
public async Task Get(string fileName)
{
var memoryStream...