2015-06-18 5 views
0

Я пытаюсь отправить запрос POST на сайт в C#, а затем проанализировать html в ответе, чтобы получить от него определенные имена элементов. Тем не менее, я получаю ошибку 408 около 50% времени, когда я запускаю программу. Вот мой код (большинство взято отсюда: https://msdn.microsoft.com/en-us/library/debx8sh9.aspx):Случайная ошибка 408 при запросе POST

using System; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.Collections.Generic; 
using HtmlAgilityPack; 
using System.Net; 
using System.Diagnostics; 
using Newtonsoft.Json.Linq; 
using System.Linq; 
using Fizzler.Systems.HtmlAgilityPack; 

class FinderClass 
{ 
    //some irrelevant code here 

    public int getItemIndex(string itemName) 
    { 
     itemName = itemName.Replace(" ", "+");  //formatting for request 
     itemName = itemName.Replace("|", "%7C"); 


     //taken from https://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx : 

     WebRequest request = WebRequest.Create("http://csgolounge.com/ajax/tradeCsRightTmp.php"); //address to send request 
     request.Method = "POST"; 
     string postData = "type=Type+-+All&quality=0&exterior=0&fraze=" + itemName + "&search=1&page=1"; //request parameters 
     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = byteArray.Length; 

     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

     WebResponse response = request.GetResponse(); 
     Debug.WriteLine(((HttpWebResponse)response).StatusDescription); 
     dataStream = response.GetResponseStream(); 

     StreamReader reader = new StreamReader(dataStream); 
     string responseFromServer = reader.ReadToEnd(); 
     Debug.WriteLine(responseFromServer); //print response to debug console (temporary) 

     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

     return -1;  //placeholder for when item index is parsed from html and returned 
    } 
} 

Исключение брошено:

Необработанное исключение типа «System.Net.WebException» произошло в System.dll

Дополнительная информация: Удаленный сервер возвратил ошибку: (408) Тайм-аут запроса.

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

+0

Будьте осторожны при копировании кода из Интернета, даже с MSDN. Он написан для иллюстрации того, что автор хочет проиллюстрировать, а не как пример хорошего профессионального кода. В отправленном вами кодеке 'Stream',' WebResponse' и 'StreamReader' все должны находиться в' использовании' блоков. Попробуйте это и посмотрите, решит ли он проблему. Возможно, у вас закончились ресурсы, потому что во всех случаях вы не очищаетесь (например, если выбрано исключение). –

+0

Проверьте этот вопрос, может быть, связан с вашими http://stackoverflow.com/questions/1667720/http-408-request-timeout – bateloche

+0

@JohnSaunders У меня есть 'использование' в начале моего кода, если это то, что вы имеете в виду, но кроме этого я не уверен, что я действительно понимаю, что вы говорите (извините, я новичок в C#). – daltonv297

ответ

0

Любое время, которое я слышу «так и такая сетевая проблема происходит через некоторое время», я стараюсь посмотреть код и посмотреть, правильно ли используются блоки using.

using блоки должны использоваться всякий раз, когда вы

  1. Создать некоторый ресурс, и
  2. Используйте этот ресурс, и
  3. Финиш с этим ресурсом в том же методе

(есть в некоторых случаях, но это самый распространенный случай)

В лету ур код, вы создаете WebResponse, Stream и StreamReader, вы используете их, затем вы заканчиваете с ними, и вы не убираете.

Вручную использовать звонок Dispose или Close не всегда достаточно. Они будут пропущены, если исключение будет отправлено в код и необработано. Блок using гарантирует, что очистка произойдет, даже в случае необработанных исключений.

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