6

ライブxmlファイル(ライブURLから)をXmlDataDocumentにロードするタスクを実行していますが、エラーが発生するたびに次のようになります。

操作がタイムアウトしました

コードは次のとおりです。xmlフィードを含むURL、xmlDocにロードしたいと思います。

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

解決策を提案してください。

4

4 に答える 4

20

XmlDataDocumentクラスのLoadメソッドを直接使用しないでください。長時間実行されるHTTPリクエストに関しては、動作に影響を与える方法はほとんどありません。

代わりに、HttpWebRequestクラスとHttpWebResponseクラスを使用して作業を行い、その後の応答をドキュメントにロードします。

例えば:

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

このコードをローカルアプリインスタンスでテストしたところ、XmlDocumentにURLのデータが入力されています。

上記の例では、XmlDocumentの代わりにXmlDataDocumentを使用することもできます。XmlDocumentは(まだ)廃止としてマークされていないため、使用することをお勧めします。

私はこれをあなたのための関数で包みました:

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;

}

以下を使用して電話するだけです。

XmlDocument document = GetDataFromUrl("http://www.globalgear.com.au/productfeed.xml");
于 2012-05-02T11:18:18.463 に答える
1

私の知る限り、使用している方法でタイムアウトを調整する簡単な方法はありません。

最も簡単な変更は、webclientクラスを使用し、timeoutプロパティを設定することです。これについては、http://w3ka.blogspot.co.uk/2009/12/how-to-fix-webclient-timeout-issue.htmlで説明されています。次に、Webクライアントでdownloadfileを使用します。次に、保存したファイルをXMLDocumentにロードします。

于 2012-05-02T11:12:41.090 に答える
1

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

        }
    }
}

この例では、10分に設定します。

于 2012-05-02T11:23:48.087 に答える
1

これを修正するための最初のステップであるはずの以前の回答に加えて、応答を既にロードして接続を閉じているにもかかわらず、この例外が発生し続けました。

私にとっての解決策:提供された値が実際にはXMLでない場合、Load()andLoadXml()メソッドは独自のTimeout例外をスローします。この場合、応答コンテンツがXMLで機能したことを確認します(これには、応答を取得するホストが実際にコンテンツタイプを設定する必要があります)。

ダッシュの答えに基づいて構築する:

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;

}
于 2017-02-16T19:55:56.340 に答える