2013-02-14 3 views
0

Я занят приложением C#, которое должно загружать данные на сайт. Я использую http post для загрузки данных, но это слишком медленно для нашего приложения. Для загрузки небольшого количества данных требуется около 1,5 секунд. Я попробовал два разных подхода.C# Сообщение http request slow

подход 1, используя WebRequest:

WebRequest request = WebRequest.Create(packet.url.ToString()); 
       request.Method = "POST"; 
       request.Proxy = null; 
       byte[] byteArray = Encoding.UTF8.GetBytes(packet.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(); 
       dataStream = response.GetResponseStream(); 
       StreamReader reader = new StreamReader(dataStream); 
       string responseFromServer = reader.ReadToEnd(); 
       reader.Close(); 
       dataStream.Close(); 
       response.Close(); 

Approach2, используя WebClient:

string responseFromServer; 
       using (WebClient wc = new WebClient()) 
       { 
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
        responseFromServer = wc.UploadString(packet.url, packet.postData); 
       } 

Оба они имеют точно такую ​​же задержку. Я тестировал одно и то же в javascript. Я использовал xmlhttprequest для отправки тех же данных на сервер, и для загрузки данных потребовалось меньше 0,5 с. Пожалуйста, дайте мне знать, если есть более быстрый способ сделать это в C#.

+0

Был ли C# и Javascript запущен на той же машине и сетевой среде? –

+0

Вы уверены, что это не проблема сервера? – BrokenGlass

+0

Возможный поиск DNS, вызывающий медленность. – leppie

ответ

0

Попытка первого подключения немного медленно, кроме того, что остальные соединения выглядят нормально.

При первой попытке подключения к хосту HttpWebRequest выполняет большую работу, он должен поддерживать ConnectionPool и обрабатывать многие другие вещи. HttpWebRequest само по себе очень сложно.

Не волнуйтесь, если только первый запрос идет медленно.

Теперь xmlhttprequest реагирует быстро, потому что браузер имеет тенденцию поддерживать соединение для любого хоста, поддерживающего его за справедливую долю времени. Следовательно, ответ быстрее!

+0

Каждый раз, когда я загружаю данные, для загрузки данных требуется примерно 1,5-2 секунды, а не только в первый раз. Каждый раз, когда мне нужно отправлять данные, я создаю новый объект WebRequest. Есть ли способ повторного использования одного и того же объекта, чтобы он поддерживал ConnectionPool или это происходит автоматически? Есть ли какое-то преимущество в использовании HttpWebRequest через WebRequest? – ControlYourWay

+0

, если вам нужен более быстрый ответ, попробуйте 'System.Net.Socket', я написал обертку для себя, и это очень быстро! –

0

Вы должны установить Proxy = null, что увеличивает общую скорость всех HTTP-запросов.

+0

На третьей строке в подходе 1 я установил Proxy равным null. К сожалению, это не ускорилось – ControlYourWay

0

Необходимо отправить весь объем данных в одном запросе, так как AppDeveloper сказал, что webrequest требует много времени для инициализации. Я могу предложить вам сделать что-то вроде этого: Как я думаю, у вас есть список и для каждого отдельного postData вы создаете новый веб-запрос. Поэтому вы должны разобрать весь список JSON, а затем отправить полный список на сервер через WebRequest. Это займет 2 секунды, но вы отправите целые данные за 2 секунды.

0

Старая нить, но это может вас устроить - ServicePointManager.UseNagleAlgorithm = false;.