2010-10-13 31 views
6

Estoy usando System.Net.WebClient para realizar algunas operaciones HTTP en modo asíncrono. La razón para utilizar operaciones asíncronas es, por encima de cualquier otra cosa, el hecho de que recibo indicaciones de cambio de progreso, que solo está disponible para operaciones asíncronas, como se indica en the docs.Obtener encabezados HTTP en la solicitud asíncrona de WebClient

Así que digamos que he puesto mi cliente Web a:

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

y el delegado:

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 
} 

Como puede ver, estoy asumiendo que si se eleva no es una excepción, las solicitudes fue siempre exitoso (que puede no ser el caso, ya que el código de estado de respuesta HTTP puede ser! = 2xx). De la documentación en UploadFileAsync no puedo decir si una respuesta que no sea 200 también se procesa.

Soy realmente nuevo a C# y parece que no puedo encontrar una manera de acceder a los encabezados para la respuesta de esa solicitud asincrónica particular. Me parece que cada WebClient solo puede contener una respuesta (o un conjunto de encabezados) en cualquier momento dado.

Si bien no voy a ejecutar varias solicitudes paralelas al mismo tiempo, me gustaría saber si existe una forma más elegante de recuperar los encabezados/códigos de estado de una solicitud en particular, en lugar de tener que obtener la respuesta "último disponible" del WebClient.

Gracias.

+0

¿Estás en .NET 4.5? Si es así, intente utilizar las sobrecargas TaskAsync ... aún tendría que acceder a los encabezados de la clase WebClient, pero no lo encontraría objetable utilizando el flujo de trabajo TAP ... Estoy de acuerdo con que se siente un poco mal hacerlo en un controlador de eventos ordinario. 'await client.UploadStringTaskAsync (...); var headers = client.ResponseHeaders; ' – TCC

Respuesta

0

¿Estás en .NET 4.5? Si es así, intente utilizar las sobrecargas TaskAsync ... aún tendría que acceder a los encabezados desde la instancia de WebClient, pero no me parece nada objetable con el flujo de trabajo de TAP ... Estoy de acuerdo con que se siente un poco mal hacerlo en un controlador de eventos ordinario.

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

Lo mejor de todo lo que se puede hacer todo en el subproceso de interfaz de usuario ... no bloqueará ... por lo que su 'disparador de actualización de interfaz de usuario' es en realidad la 'actualización de interfaz de usuario'.

Cuestiones relacionadas