2010-03-17 819 views
18

我一直致力於開發各種各樣的中間人應用程序,使用的HTTP POST請求了一系列的日期(通常7,上傳文本到CMS後臺同時)。我正在使用HttpWebRequest來完成此操作。它似乎工作正常的第一個日期,但是當它開始第二個日期我得到System.Net.WebException:請求被中止:請求被取消。HttpWebRequest的:請求已中止:請求已被取消

我搜索了一圈,發現下面的大線索:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/0d0afe40-c62a-4089-9d8b-fb4d206434dc

http://www.jaxidian.org/update/2007/05/05/8

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

而且他們都沒有太大的幫助。我已經嘗試重載GetWebReuqest,但這沒有意義,因爲我沒有使用該函數。

這裏是我的代碼: http://pastebin.org/115268

我的錯誤就行245已成功運行至少一次後。

我想感謝所有幫助我可以,因爲這是一個項目,我已經工作了一段時間的最後一步。這是我的第一個C#/ VS項目,所以我願意接受任何提示,但我想專注於首先解決此問題。

謝謝!

+0

該引擎收錄鏈接被打破。 – 2017-08-07 14:40:50

回答

15

在互聯網上列出的常見解決方案似乎是對的HttpWebRequest的KeepAlive屬性設置爲false。這可以解決問題,如果根本原因是即使連接在一段時間後實際自動關閉,也希望重新使用該連接。但是,不斷打開和關閉連接會造成性能下降。

我遇到此問題時使用的另一種可能解決方案是擴展超時屬性:WebRequest.ReadWriteTimeout,WebRequest.Timeout,RequestStream.WriteTimeout和RequestStream.ReadTimeout。請注意,這些都是以毫秒爲單位,所以你可能要超時爲1000 * 60 * 10代表10分鐘(或只是60萬,如果你認爲你會知道這意味着什麼......)。您可以通過減小文件大小來測試這是否是導致問題的更可能原因。

順便說一句。您的代碼不再在列出的網站上。如果問題仍然存在,您可能希望將其包含在文章中。

3

我的應用程序的一個小結: 我有高達16個相同的線程同時執行HTTP請求。這些線程中的每一個都從不同的Web服務器請求以及唯一的本地端點。現在,這些調用的函數有3個連續的HTTP請求(對同一個Web服務器),並進行一些聚合。

根據張貼在上面的鏈接的方案,下面結合爲我工作。

System.Net.ServicePointManager.DefaultConnectionLimit = 200; 
System.Net.ServicePointManager.MaxServicePointIdleTime = 2000; 
System.Net.ServicePointManager.MaxServicePoints = 1000; 
System.Net.ServicePointManager.SetTcpKeepAlive(false, 0, 0); 

HttpWebRequest webRequest1 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP 
+ "/xslt?"); 
webRequest1.KeepAlive = false; 
webRequest1.Timeout = 2000; 
//Do other stuff here... 
//Close response stream 

Thread.Sleep(1000); //This delay seems to help. Obviously very specific to the server 

HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP 
+ "/xslt?"); 
webRequest2.KeepAlive = false; 
webRequest2.Timeout = 2000; 
//Do other stuff here... 
//and so on... 
+1

您不應該在通話之間需要睡眠。如果請求的超時時間不夠大(2000毫秒僅爲2秒),則應該在合理範圍內使它們變大。如果您正在進行大量的HTTP調用,請注意您可以使用其他人提到的KeepAlive = false性能。 – MonkeyWrench 2015-03-02 16:57:38

12

這是唯一的解決方案適用於我:

http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx

這些行是關鍵:

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(yourUri); 
    wr.KeepAlive = false; 
    wr.Timeout = System.Threading.Timeout.Infinite; 
    wr.ProtocolVersion = HttpVersion.Version10; 

在這裏:

wr.AllowWriteStreamBuffering = false; 
+9

'無限'相當長。 :) – dotNET 2015-09-03 15:53:48