2017-10-11 76 views
0

我已經看到其他一些線程但尚未找到解決方案。當從調試模式運行C#Windows From時,我可以使用WebClient從網頁讀取數據。但是,一旦爲應用程序創建可執行文件,我無法從網頁讀取數據。這裏我得到的例外:System.Net.WebException:底層連接已關閉:現有連接被遠程主機強制關閉

System.Net.WebException:底層連接已關閉:發送時發生意外錯誤。 ---> System.IO.IOException:無法從傳輸連接讀取數據:現有連接被遠程主機強制關閉。 ---> System.Net.Sockets.SocketException:現有連接被遠程主機 強制關閉在System.Net.Sockets.Socket.Receive(Byte []緩衝區,Int32偏移量,Int32大小,SocketFlags socketFlags) 在System.Net.Sockets.NetworkStream.Read(字節[]緩衝液,的Int32偏移的Int32大小)

---內部異常堆棧跟蹤的結尾---

下面是代碼我的一個片段正在使用:

WebClient webClient = new WebClient(); 
webClient.UseDefaultCredentials = true; 
webClient.Proxy.Credentials = CredentialCache.DefaultCredentials; 
webClient.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); 
string page = webClient.DownloadString(webPath + manPartNum); 

就像我以前說的,我能夠得到這個在調試中正確工作模式的視覺工作室,但只要我創建可執行文件,我不能再從網頁上讀取。任何幫助,將不勝感激。什麼可能導致這個問題?

+0

有幾種可能性。 1)由於編譯器的依賴性問題,所有更改都沒有進入可執行文件。所以你可以刪除完全重建項目的bin文件夾,這樣發佈模式就會重建2)代碼第一次運行。但是第二次建立了一個cookie,並且運行有cookie的代碼有問題。所以你可以打開一個IE瀏覽器並刪除包括cookie的歷史記錄,然後重試。或返回到調試版本並查看它是否仍然有效.3)您的舊連接未關閉,並且服務器不允許來自同一IP地址的多個連接。 – jdweng

+1

'UseDefaultCredentials'和您提供的當前用戶憑證是否有衝突?當你在調試中「成功」時,我會在輸出窗口中查看它,以確保它不會在那裏拋出,但讓你無論如何都能擺脫它。 – DonBoitnott

+0

感謝您的快速響應。我嘗試了你的建議。 1)我刪除了bin文件夾並完全重建了該項目。沒有成功。 2)我在調試模式下重新運行程序,在調試模式下它仍能正常工作。 3)有沒有辦法讓我關閉webclient? weblient.Close()? –

回答

0

另一種方法是使用一個HttpWebRequest代替:

String responseFromServer = null; 
var url = webPath + manPartNum; 
var request = (HttpWebRequest)HttpWebRequest.Create(urlPing); 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; 
var response = (HttpWebResponse)request.GetResponse(); 
if (response.StatusCode == HttpStatusCode.OK) 
{ 
    using (var dataStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(dataStream)) 
      responseFromServer = reader.ReadToEnd(); 
    } 
} 

if (!String.IsNullOrEmpty(responseFromServer)) 
{ 
} 

除非你是真正的「洛在」頁面,您的WebClient使用可能是不必要的。如果你只需要請求頁面響應,那麼這應該避免所有這些驗證頭痛。

+0

再次感謝。但是,與WebClient一樣,我也遇到了與HttpWebRequest相同的錯誤。我認爲我的問題更多與我嘗試訪問的網站有關。例如,我可以訪問一個分銷商網站,但不能訪問另一個。該網站似乎認識到我的應用程序是一個機器人。 –

+0

@TylerWilson這可能會限制類似的連接的頻率。你看到的間歇模式可能是因爲你試圖將它們靠得太近,它不喜歡那樣。 DDoS預防等。 – DonBoitnott

+0

有什麼辦法可以避開這種DDoS預防?這顯然是有原因的。在我的代碼中添加延遲是否允許這樣做? –

0

經過更多研究後,我可以確定我嘗試訪問的網站具有OAuth 2.0身份驗證和授權。看起來我必須在公司註冊並使用他們的API通過我的應用程序訪問他們的網站。希望這可以幫助別人。

相關問題