- Come accedere alle intestazioni di risposta, prima che l'intera risposta sia stata ritrasmessa?
- Come si legge lo stream mentre arriva?
- HttpClient è la scelta migliore per un controllo granulare della ricezione della risposta http?
Ecco un elemento di cattura che potrebbe illustrare la mia domanda:Leggere intestazioni da HttpResponseMessage prima che il contenuto sia completo al 100%
using (var response = await _httpClient.SendAsync(request,
HttpCompletionOption.ResponseHeadersRead))
{
var streamTask = response.Content.ReadAsStreamAsync();
//how do I check if headers portion has completed?
//Does HttpCompletionOption.ResponseHeadersRead guarantee that?
//pseudocode
while (!(all headers have been received))
//maybe await a Delay here to let Headers get fully populated
access_headers_without_causing_entire_response_to_be_received
//how do I access the response, without causing an await until contents downloaded?
//pseudocode
while (stremTask.Resul.?) //i.e. while something is still streaming
//? what goes here? a chunk-read into a buffer? or line-by-line since it's http?
...
Modifica chiarire un'altra zona grigia per me:
Ogni riferimento ho portato alla luce è una sorta di dichiarazione di blocco, ciò farebbe attendere l'arrivo dei contenuti.
I riferimenti a cui leggo di solito accedono a metodi o proprietà sullo streamTask.Result o sul Contenuto e non ne so abbastanza per escludere quali riferimenti siano corretti mentre lo streamTask sta procedendo contro quali causeranno un'attesa fino a quando il compito completato.
ho scritto una risposta, ma poi si rese conto che era un po 'mal studiato e pigro. Invece ho una domanda di follow-up, cosa intendi per dichiarazione di blocco? Tutte le operazioni di HttpClient sono asincrone, non dovrebbe esserci nulla che ti impedisca di leggere le intestazioni e il flusso di contenuti su attività separate, impedendo loro di bloccarsi a vicenda. – Snixtor
@Snixtor, la mia domanda è probabilmente basata su un'assunzione errata, che se attendo esplicitamente o accedo a stremTask.Result, farò leggere l'intero contenuto. In definitiva stavo cercando l'impianto idraulico A) leggere le intestazioni, B) leggere lo stream così com'è Elaborerò la mia domanda con lo pseudo-codice per illustrare che cosa sto immaginando dovrebbe accadere. –
Hai ragione, questa è un'ipotesi errata. 'streamTask.Result' bloccherà fino a quando' Stream' non sarà disponibile, ma non richiederà che l'intero contenuto del flusso sia già stato trasferito. Tecnicamente potrebbero essere disponibili byte di contenuto zero dopo aver chiamato 'streamTask.Result'. – Snixtor