2016-12-06 4 views
0

У меня есть объект 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; 
} 
+0

Можете ли вы показать свое HttpClient позвонить? Большинство методов HttpClient буферизуют ответ по умолчанию. Вам нужен тот, который не работает, как GetStreamAsync или SendAsync с HttpCompletionOption.ResponseHeadersRead. – Tratcher

+0

Я обновил вопрос. Благодарю. – bpiec

+0

Выглядит нормально, (кроме использования ждут вместо результата). – Tratcher

ответ

0

Я предполагаю, что это в IIS? System.Web также буферы ответов: https://msdn.microsoft.com/en-us/library/system.web.httpresponse.bufferoutput(v=vs.110).aspx

См server.DisableResponseBuffering в https://katanaproject.codeplex.com/wikipage?title=OWIN%20Keys&referringTitle=Documentation

+0

Да, он размещен на IIS. Но мы вообще не используем System.Web (у нас даже нет ссылки на него). – bpiec

+0

OWIN на IIS использует System.Web (Microsoft.Owin.Host.SystemWeb) – Tratcher