2012-05-02 32 views
5

tôi đang làm nhiệm vụ tải file xml sống (từ url sống) để XmlDataDocument, nhưng mỗi lần tôi nhận được lỗi:Timeout lỗi khi tải Xml từ URL

The operation has timed out

Mã này được như sau, The url chứa các nguồn cấp dữ liệu xml, tôi muốn tải nó vào xmlDoc.

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

Vui lòng đề xuất bất kỳ giải pháp nào.

Trả lời

18

Không sử dụng phương thức tải của lớp XmlDataDocument trực tiếp; bạn có ít hoặc không có cách nào ảnh hưởng đến hành vi khi nói đến các yêu cầu HTTP chạy dài.

Thay vào đó, hãy sử dụng các lớp HttpWebRequest và HttpWebResponse để thực hiện công việc cho bạn, sau đó tải phản hồi tiếp theo vào tài liệu của bạn.

Ví dụ:

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); 

Tôi đã thử nghiệm mã này trong một trường hợp ứng dụng địa phương và XmlDocument là dân cư với các dữ liệu từ URL của bạn.

Bạn cũng có thể thay thế trong XmlDataDocument cho XmlDocument trong ví dụ trên - Tôi thích sử dụng XmlDocument vì nó chưa được đánh dấu là lỗi thời.

Tôi đã bọc này trong một chức năng cho bạn:

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; 

} 

Đơn giản chỉ cần gọi sử dụng:

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

Xin chào, Cảm ơn bạn đã trả lời, tôi đã sử dụng giống như bạn đã đề cập ở trên, Tôi vẫn nhận được lỗi tương tự. Tôi đã đặt Thời gian chờ thành 60000. – chetan1539

+0

Bạn có thể truy cập URL từ trình duyệt của mình và mất nhiều thời gian không? Nếu có, tăng thời gian chờ. Bạn có biết nếu bạn có một proxy? Nếu bạn có một proxy, bạn có thể cần phải thiết lập mã này. – dash

+0

vâng tôi truy cập url nhưng không mất quá nhiều thời gian để hiển thị nội dung trên trang. – chetan1539

1

Theo tôi, không có cách nào dễ dàng để điều chỉnh thời gian chờ bằng phương pháp bạn đang sử dụng.

Thay đổi dễ dàng nhất là sử dụng lớp webclient và đặt thuộc tính thời gian chờ. Điều này được mô tả ở đây http://w3ka.blogspot.co.uk/2009/12/how-to-fix-webclient-timeout-issue.html. Sau đó sử dụng downloadfile trên webclient. Sau đó tải tệp đã lưu trong XMLDocument.

+0

Nhưng tôi muốn đọc feed.Thanks URL trực tiếp cho bạn reply.That lý do tại sao tôi đang sử dụng phương pháp này. – chetan1539

1

cài đặt thời hạn cho yêu cầu web của bạn:

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); 

     } 
    } 
} 

Ví dụ này sẽ đặt thành 10 phút.

+0

Cảm ơn bạn đã trả lời, tôi đặt cùng thời điểm như bạn đã đặt ví dụ trên vẫn còn hiển thị lỗi tương tự – chetan1539

+0

Bạn có nhận được gì từ máy chủ không? Điều gì xảy ra nếu bạn thêm chuỗi đầu tiên = sReader.ReadLine(); và in nó ra? Bạn có nhận được gì khi mở tệp trong trình duyệt không? –

+0

Khi tôi mở url này trong trình duyệt thì sẽ không mất quá nhiều thời gian để hiển thị nội dung của tệp xml. – chetan1539

1

Ngoài các câu trả lời trước, đây là bước đầu tiên để sửa lỗi này, tôi tiếp tục nhận ngoại lệ này mặc dù đã tải phản hồi và đóng kết nối.

Giải pháp cho tôi: các phương pháp Load()LoadXml() sẽ ném ngoại lệ Thời gian chờ của riêng chúng nếu giá trị được cung cấp không thực sự là XML. Kiểm tra để xác minh rằng nội dung phản hồi là XML đã làm việc trong trường hợp của chúng tôi (điều này sẽ yêu cầu máy chủ bạn nhận được phản hồi của bạn từ thực sự đặt loại nội dung).

xây dựng trên câu trả lời của dấu gạch ngang:

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; 

} 
Các vấn đề liên quan