2011-07-23 18 views
0

早些時候,我做了一個HttpWebRequest工作得很好,我的StreamReader完美地讀取了網站的HTML。C#HttpWebRequest突然掛起程序。沒有更早

但是突然之間,在測試過它的功能並確認它已經工作了很多次之後,它會在程序涉及StreamReader時掛起程序。 我試過刪除這一行,代碼繼續。

事情是;我嘗試輸入一個不同的網站,而不是我需要使用的網站(我把它放在www.google.com中),它工作得很好。所以我的錯誤結論是,它只是我需要使用的網站,我再也無法訪問,這使我認爲終端(網站)取消了我的連接或阻止了我或某事。但! HttpWebRequest本身不會掛起或任何東西,這意味着它成功地建立了對網站的請求?

足夠閒聊,這裏是代碼:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("website here"); 
MessageBox.Show("1"); //This is shown. 
string HTMLLink = (new  StreamReader(request.GetResponse().GetResponseStream())).ReadToEnd(); //This is where the  program hangs.... 
MessageBox.Show("2"); //This is not shown! Below this isn't being executed. 
if (HTMLLink.Length > 0) 
{ 
    HTMLLink = HTMLLink.Substring(HTMLLink.IndexOf("uuu"), HTMLLink.Length -  HTMLLink.IndexOf("uuu")); 
    HTMLLink = HTMLLink.Substring(0, HTMLLink.IndexOf("\" TARGET=")); 
    request = (HttpWebRequest)WebRequest.Create(HTMLLink); 
    string HTML = (new  StreamReader(request.GetResponse().GetResponseStream())).ReadToEnd(); 
    if (HTML.Length > 0 && HTML.Contains(" </script><br><br><br>") && HTML.Contains(" <br><br><script ")) 
    { 
     HTML = HTML.Substring(HTML.IndexOf(" </script><br><br><br>") + 22,  HTML.IndexOf("<br><br><script ")); 
     HTML = HTML.Substring(0, HTML.IndexOf("<br><br><script ")); 
     HTML = HTML.Replace("\r\n", ""); 
     HTML = HTML.Replace("\n", ""); 
     HTML = HTML.Replace("<br>", "\r\n"); 
     HTML = HTML.Replace("<BR>", "\r\n"); 
     HTML = HTML.Replace("<br />", "\r\n"); 
     HTML = HTML.Replace("<BR />", "\r\n"); 
     textBox.Text = HTML; 
    } 
} 

而且請記住,它完美地工作較早,那麼所有的突然它開始懸掛,而且它正常工作與www.google.com 。

順便說一句,是的,我做了很多搜索。沒有有用的結果。

我已經試過超時了,它超時。 也許該網站阻止了我的程序,認爲它是一隻蜘蛛?然後怎樣呢?

每當我到達StreamReader(無論我如何設置它),它都會開始掛起。 它一直掛着,它沒有提供任何結果。 這隻發生在lyrics007.com這是我需要的確切網站。它適用於谷歌。

請幫忙!

在此先感謝!

回答

1

WebRequest.GetResponse()是一個阻塞呼叫。它將等待,直到它可以成功地連接並接收響應,然後再將控制權返回給調用者,否則將在不成功時拋出異常。此行爲無法修改。

你通常不希望你的應用程序坐在等待發生的事情,所以你通常將GetResponse()調用委派給另一個線程,這樣你就可以繼續在當前線程中做其他工作。

解決此問題的常用方法是異步調用。您將調用BeginGetResponse(),而不是調用GetResponse,而是傳遞一個應在操作完成時執行的函數(例如,包含當前方法的其餘部分,再加上對EndGetResponse()的調用)。執行控制可以傳回給調用者,同時在後臺線程中等待響應,由.NET線程池自動爲您處理。

+0

已解決!謝謝你們兩位! – Jobobj

0

該請求不會被髮送,直到GetResponse的呼叫。如果這是掛起的地方,我會傾向於說該網站沒有迴應。您是否嘗試使用網絡瀏覽器連接到該URL並查看它是否有效?

+0

是的,這個工作較早,該網站是www.lyrics007.com,你可以看到它自己,它工作得很好:)。 – Jobobj