2011-02-15 7 views
9

¿cómo puedo cargar una cadena grande (en mi caso XML con BLOB) con POST sin obtener tiempo de espera con GetResponse?C#: ¿Cómo POSTAR una cadena grande a través de WebRequest?

Cambiar el tiempo de espera ayuda, pero esto no es realmente una solución. Si el servidor está realmente muerto o el mensaje POST fue interrumpido, tengo que esperar el gran tiempo de espera extremo.

¿Alguna idea?

HttpWebRequest webRequest = null; 
string response = ""; 
byte[] bytes = Encoding.UTF8.GetBytes(xml); 

try 
{ 
    webRequest = (HttpWebRequest)WebRequest.Create("http://" + this.host + ":" + this.port); 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.Method = "POST"; 
    webRequest.Timeout = 5000; 

    webRequest.ContentLength = bytes.Length; 
    using (Stream requeststream = webRequest.GetRequestStream()) 
    { 
     requeststream.Write(bytes, 0, bytes.Length); 
     requeststream.Close(); 
    } 

    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) 
    { 
     using (StreamReader sr = new StreamReader(webResponse.GetResponseStream())) 
     { 
      response = sr.ReadToEnd().Trim(); 
      sr.Close(); 
     } 
     webResponse.Close(); 
    } 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 
return response; 
+0

aplicación debe estar diseñado de modo que usted no tiene que fijar muy gran cantidad de datos. –

+0

Mi opinión sobre el tema es la misma. Si ve que la "plataforma" no lo admite, intente encontrar otra forma de hacerlo. De lo contrario, utilizaría el enfoque de @Marc Gravell con la compresión gzip y el número limitado de subidas. –

Respuesta

3

Sí, esto es bastante esperado comportamiento http.

Opciones:

  • tienen un gran tiempo de espera (que ya has hecho esto), y aceptan que podría tomar mucho tiempo para legítimamente tiempo de espera (en lugar de tomar un tiempo debido a la anchura de banda)
  • quizás pueda aplicar gzip en la solicitud (y decirle al servidor que lo está enviando comprimido); Sinceramente, no sé si esto es compatible automáticamente, pero sin duda podría hacerse mediante la API de comprobación explícita para una cabecera particular y la aplicación de la descompresión gzip en la carga útil
  • cambio de la API para realizar una serie de pequeñas cargas, y un mensaje de finalización
  • vivir con ella
+8

Intenté esa última opción, parece que no funciona. –

+0

Desafortunadamente, el servicio web solo acepta cadenas XML. Entonces tengo que usar un tiempo de espera largo. Gracias – Wowa

Cuestiones relacionadas