У меня есть объект HttpResponse
в результате вызова HttpClient.SendAsync()
. Ответ имеет chunked
transfer encoding и дает 1,5 ГБ данных.Streaming HttpResponse через Owin
Я хочу передать эти данные через трубопровод OWIN. Для этого мне нужно преобразовать его в поток. Упрощенный код, чтобы сделать это:
public async Task Invoke(IDictionary<string, object> environment)
{
var httpContent = GetHttpContent();
var responseStream = (Stream)environment["owin.ResponseBody"];
await httpContent.CopyToAsync(responseStream);
}
Однако последняя строка приводит копирование всего потока в памяти. И когда я использую wget
для загрузки данных непосредственно с серверного сервера, он загружается успешно и показывает индикатор выполнения (хотя он не знает общий размер, так как он фрагментирован). Но когда я использую wget
для загрузки данных из моего приложения, размещенного в OWIN, оно хранится при отправке запроса.
Как я должен передавать эти данные через конвейер OWIN, чтобы предотвратить его копирование в память?
EDIT
Это, как я получаю HttpResponse
:
var client = new HttpClient(new HttpClientHandler());
// …and then:
using (var request = new HttpRequestMessage { RequestUri = uri, Method = HttpMethod.Get })
{
return client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
}
Можете ли вы показать свое HttpClient позвонить? Большинство методов HttpClient буферизуют ответ по умолчанию. Вам нужен тот, который не работает, как GetStreamAsync или SendAsync с HttpCompletionOption.ResponseHeadersRead. – Tratcher
Я обновил вопрос. Благодарю. – bpiec
Выглядит нормально, (кроме использования ждут вместо результата). – Tratcher