0

これは機能です:

private static HtmlAgilityPack.HtmlDocument getHtmlDocumentWebClient(string url, bool useProxy, string proxyIp, int proxyPort, string usename, string password)
        {
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            WebClient client = new WebClient();
            //client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
            client.Credentials = CredentialCache.DefaultCredentials;
            client.Proxy = WebRequest.DefaultWebProxy;
            if (useProxy)
            {
                //Proxy                
                if (!string.IsNullOrEmpty(proxyIp))
                {
                    WebProxy p = new WebProxy(proxyIp, proxyPort);
                    if (!string.IsNullOrEmpty(usename))
                    {
                        if (password == null)
                            password = string.Empty;
                        NetworkCredential nc = new NetworkCredential(usename, password);
                        p.Credentials = nc;
                    }
                }
            }
            Stream data = client.OpenRead(url);
            doc.Load(data);
            data.Close();
            return doc;
        }

私はプログラムの各反復でリンクを取得し、数回後に変数 url は次のようになります。

http://appldnld.apple.com/iTunes10/041-7196.20120912.Ber43/iTunesSetup.exe

InternetExplorer でこのリンクを試すと、ファイルのダウンロードが試行されます。しかし、私のプログラムでは、次の行でロードしようとしています:

doc.Load(データ);

しばらくするとプログラムがフリーズしてスタックし、最後にタスクマネージャーでアプリケーションを強制終了すると、プログラムは例外をスローします:

StackOverFlowException was unhandled 

An unhandled exception of type 'System.StackOverflowException' occurred in HtmlAgilityPack.dll

System.StackOverflowException was unhandled
Message: An unhandled exception of type 'System.StackOverflowException' occurred in HtmlAgilityPack.dll

今、私はブレークポイントを使用しましたが、問題は次の行で発生します:

doc.Load(data);

問題は、このリンクの場合、どのように処理すればよいですか? 試してキャッチして無視する必要がありますか、それともこれをリンクと見なす必要がありますか? 将来、このリンクを使用して exe ファイルをダウンロードしたいので、ctach を試してみるのはお勧めできません。


編集:

getHtmlDocumentWebClient は次のようになります。

private  static HtmlAgilityPack.HtmlDocument getHtmlDocumentWebClient(string url, bool useProxy, string proxyIp, int proxyPort, string usename, string password)
        {

            HttpWebRequest myHttpWebRequest = null;     //Declare an HTTP-specific implementation of the WebRequest class.
            HttpWebResponse myHttpWebResponse = null;   //Declare an HTTP-specific implementation of the WebResponse class
            //Create Request
            myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
            myHttpWebRequest.Method = "GET";
            myHttpWebRequest.ContentType = "text/html; encoding='utf-8'";
            //Get Response
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

            Stream data = myHttpWebResponse.GetResponseStream();//client.OpenRead(url);
            doc.Load(data);
            data.Close();
            return doc;
        }

まだ同じ問題。関数の何が問題になっていますか? text/html コンテンツの実際のチェックを行うにはどうすればよいですか?

4

1 に答える 1

1

Content-Type応答を HTML として解析する前に、 を確認する必要があります。
そうでない場合、text/htmlまたはそのバリアントの 1 つである場合は、解析しないでください。

HttpWebRequestContent-Type を取得するには、代わりにを使用する必要がありますWebClient
その後、確認できresponse.Headersます。

于 2012-09-20T02:47:14.353 に答える