2010-10-13 5 views
6

Sto utilizzando System.Net.WebClient per eseguire alcune operazioni HTTP in modalità asincrona. La ragione per utilizzare operazioni asincrone è, sopra ogni altra cosa, il fatto che ottengo indicazioni di cambio di progresso - che è disponibile solo per le operazioni asincrone, come indicato da the docs.Ottieni intestazioni HTTP in richiesta asincrona WebClient

Quindi diciamo che ho la mia WebClient impostare:

this.client = new WebClient(); 
this.client.UploadStringCompleted += 
    new UploadStringCompletedEventHandler(textUploadComplete); 

e il delegato:

private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     // trigger UI failure notification 
     return; 
    } 

    // FIXME not checking for response code == 200 (OK) 
    // trigger UI success notification 
} 

Quindi, vedete, sto assumendo che se nessuna eccezione è sollevata, le richieste erano sempre riuscito (il che potrebbe non essere il caso, dal momento che il codice di stato della risposta HTTP può essere! = 2xx). Dalla documentazione su UploadFileAsync non riesco a capire se viene elaborata anche una risposta non 200.

Sono davvero nuovo in C# e non riesco a trovare un modo per accedere alle intestazioni per quella particolare richiesta della richiesta asincrona. Mi sembra che ogni WebClient possa contenere solo una risposta (o un set di intestazioni) in un dato momento.

Mentre non eseguirò più richieste parallele contemporaneamente, mi piacerebbe comunque sapere se c'è un modo più elegante di recuperare intestazioni di risposta/codice di stato di una particolare richiesta, piuttosto che dover ottenere la risposta "last-available" dallo WebClient.

Grazie.

+0

Sei in .NET 4.5? Se è così, prova a utilizzare gli overload di TaskAsync ... avresti comunque bisogno di accedere alle intestazioni dalla classe WebClient, ma non lo troverei affatto discutibile usando il flusso di lavoro TAP ... Sono d'accordo che ci si sente un po 'in errore nel farlo un gestore di eventi ordinario. 'attendi client.UploadStringTaskAsync (...); var headers = client.ResponseHeaders; ' – TCC

risposta

0

Sei in .NET 4.5? Se è così, prova a utilizzare gli overload di TaskAsync ... avresti comunque bisogno di accedere alle intestazioni dall'istanza WebClient, ma non lo troverei affatto discutibile usando il flusso di lavoro di TAP ... Sono d'accordo che ci si sente un po 'in errore nel farlo un gestore di eventi ordinario.

await client.UploadStringTaskAsync(...); 
var headers = client.ResponseHeaders; 

Meglio di tutti si può fare tutto sul thread UI ... non bloccherà ... in modo che il 'aggiornamento dell'interfaccia utente trigger' è in realtà solo 'Aggiorna UI'.