2012-05-02 12 views
5

que estoy haciendo tarea de cargar el archivo XML en vivo (de URL en vivo) a XmlDataDocument, pero cada vez que estoy recibiendo de error:de error de tiempo de espera al cargar XML desde URL

The operation has timed out

El código es el siguiente, El url que contiene los feeds xml, quiero cargarlo en xmlDoc.

XmlDataDocument xmlDoc = new XmlDataDocument(); 
xmlDoc.Load("http://www.globalgear.com.au/productfeed.xml"); 

Por favor, sugiera cualquier solución.

Respuesta

18

No utilice el método Load de la clase XmlDataDocument directamente; tiene poco o ningún modo de influir en el comportamiento cuando se trata de solicitudes HTTP de larga ejecución.

En su lugar, use las clases HttpWebRequest y HttpWebResponse para hacer el trabajo por usted, y luego cargue la respuesta subsiguiente en su documento.

Por ejemplo:

HttpWebRequest rq = WebRequest.Create("http://www.globalgear.com.au/productfeed.xml") as HttpWebRequest; 
    //60 Second Timeout 
    rq.Timeout = 60000; 
    //Also note you can set the Proxy property here if required; sometimes it is, especially if you are behind a firewall - rq.Proxy = new WebProxy("proxy_address"); 
    HttpWebResponse response = rq.GetResponse() as HttpWebResponse; 


    XmlTextReader reader = new XmlTextReader(response.GetResponseStream()); 

    XmlDocument doc = new XmlDocument(); 
    doc.Load(reader); 

He probado este código en una instancia de aplicación local y el XmlDocument se rellena con los datos de su dirección URL.

También puede sustituir en XmlDataDocument por XmlDocument en el ejemplo anterior. Prefiero usar XmlDocument ya que no está marcado (todavía) como obsoleto.

me he envuelto en esta función para usted:

public XmlDocument GetDataFromUrl(string url) 
{ 
    XmlDocument urlData = new XmlDocument(); 
    HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url); 

    rq.Timeout = 60000; 

    HttpWebResponse response = rq.GetResponse() as HttpWebResponse; 

    using (Stream responseStream = response.GetResponseStream()) 
    { 
     XmlTextReader reader = new XmlTextReader(responseStream); 
     urlData.Load(reader); 
    } 

    return urlData; 

} 

llamar simplemente usando:

XmlDocument document = GetDataFromUrl("http://www.globalgear.com.au/productfeed.xml"); 
+0

Hola, gracias por su respuesta, he usado el mismo que menciona arriba, todavía estoy recibiendo el mismo error. Configuré el tiempo de espera en 60000. – chetan1539

+0

¿Puede visitar la URL de su navegador y lleva mucho tiempo? Si lo hace, aumente el tiempo de espera. ¿Sabes si tienes un proxy? Si tiene un proxy, puede necesitar configurar esto en el código. – dash

+0

sí Visito la url pero no demora demasiado en mostrar los contenidos en la página. – chetan1539

1

Que yo sepa, no existe una manera fácil de ajustar el tiempo de espera con el método que está utilizando.

El cambio más fácil sería utilizar la clase webclient y establecer la propiedad de tiempo de espera. Esto se describe aquí http://w3ka.blogspot.co.uk/2009/12/how-to-fix-webclient-timeout-issue.html. Luego use el archivo de descarga en el webclient. A continuación, cargue el archivo guardado en XMLDocument.

+0

Pero quiero leer feed.Thanks URL en vivo para que reply.That Es por eso que estoy usando el este método. – chetan1539

1

Establecer un tiempo de espera de la solicitud web:

using System; 
using System.Net; 
using System.Xml; 

namespace Shelver 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      WebRequest requ = WebRequest.Create("http://www.globalgear.com.au/productfeed.xml"); 
      requ.Timeout = 10 * 60 * 1000; // 10 minutes timeout and not 100s as the default. 
      var resp = requ.GetResponse(); 

      Console.WriteLine("Will download {0:N0}bytes", resp.ContentLength); 
      var stream = resp.GetResponseStream(); 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(stream); 

     } 
    } 
} 

Este ejemplo lo configurará en 10 minutos.

+0

Gracias por su respuesta, configuré el mismo tiempo que configuró el ejemplo anterior aún muestra el mismo error – chetan1539

+0

¿Obtiene algo del servidor? ¿Qué sucede si agrega cadena first = sReader.ReadLine(); e imprimirlo? ¿Obtiene algo cuando abre el archivo en el navegador? –

+0

Cuando abro esta url en el navegador, no tomará demasiado tiempo mostrar el contenido del archivo xml. – chetan1539

1

Además de las respuestas anteriores, que deberían ser el primer paso para solucionar esto, continué obteniendo esta excepción a pesar de haber cargado la respuesta y de haber cerrado las conexiones.

La solución para mí: los métodos Load() y LoadXml() lanzarían su propia excepción Timeout si el valor proporcionado no fuera en realidad XML. Verificando para verificar que el contenido de respuesta fue XML trabajado en nuestro caso (esto requerirá que el host que está recibiendo su respuesta de en realidad establece tipos de contenido).

Sobre la base de la respuesta de tablero:

public XmlDocument GetDataFromUrl(string url) 
{ 
    XmlDocument urlData = new XmlDocument(); 
    HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url); 

    rq.Timeout = 60000; 

    HttpWebResponse response = rq.GetResponse() as HttpWebResponse; 

    // New check added to dash's answer. 
    if (response.ContentType.Contains("text/xml") 
    { 
     using (Stream responseStream = response.GetResponseStream()) 
     { 
      XmlTextReader reader = new XmlTextReader(responseStream); 
      urlData.Load(reader); 
     } 
    } 

    return urlData; 

} 
Cuestiones relacionadas