2010-03-17 2 views
18

Я работал над разработкой приложений среднего класса, которые загружают текст в бэкэнд CMS, используя HTTP-запросы для серии дат (обычно 7 за раз). Я использую 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

Ссылка Pastebin сломан. –

ответ

15

Общее решение, указанное в Интернете, похоже, заключается в том, чтобы установить для свойства KeepAlive объекта HttpWebRequest значение false. Это может решить проблему, если основной причиной является то, что соединение, как ожидается, будет повторно использовано, даже если оно было фактически закрыто автоматически через некоторый период времени. Тем не менее, есть высокая производительность для постоянного открытия и закрытия соединений.

Другим возможным решением, которое я использовал при возникновении этой проблемы, было расширение свойств таймаута: WebRequest.ReadWriteTimeout, WebRequest.Timeout, RequestStream.WriteTimeout и RequestStream.ReadTimeout. Обратите внимание, что это в миллисекундах, поэтому вы можете потребовать, чтобы таймауты составляли 1000 * 60 * 10, чтобы представлять 10 минут (или всего 600000, если вы считаете, что узнаете, что это значит ...). Вы можете проверить, является ли это более вероятной причиной проблемы, уменьшив размер файла.

BTW. Ваш код больше не был на указанном веб-сайте. Вы можете включить его в текст своего сообщения, если это все еще проблема.

3

Краткий обзор моей заявки: У меня есть до 16 одинаковых потоков, выполняющих одновременные HTTP-запросы. Каждый из этих потоков запрашивает у разных веб-серверов наряду с уникальными локальными конечными точками. Теперь функция, выполняющая эти вызовы, имеет 3 последовательных HTTP-запроса, чтобы сделать (на тот же веб-сервер) и сделать некоторую агрегацию.

Основываясь на решениях, размещенных по ссылкам выше, для меня работала следующая комбинация.

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 секунды), вы должны сделать их большими, в пределах разумного. Обратите внимание на то, что вы можете использовать KeepAlive = false, о котором говорили другие, если вы делаете большое количество HTTP-вызовов. – MonkeyWrench

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

Смежные вопросы