2010-04-22 2 views
2

В настоящее время я создаю приложение C# для привязки к онлайн-системе php/MySQL. Приложение должно отправлять пост-данные в сценарии и получать ответ.Зачем отправлять данные отправки с помощью WebRequest так долго?

Когда я отправить следующие данные

 
username=test&password=test 

Я получаю следующие ответы ...

 
Starting request at 22/04/2010 12:15:42 
Finished creating request : took 00:00:00.0570057 
Transmitting data at 22/04/2010 12:15:42 
Transmitted the data : took 00:00:06.9316931  <<-- 
Getting the response at 22/04/2010 12:15:49 
Getting response 00:00:00.0360036 
Finished response 00:00:00.0360036 
Entire call took 00:00:07.0247024 

Как вы можете видеть, что это занимает 6 секунд, чтобы фактически послать данные в скрипт, Я провела дополнительное тестирование, отправив данные из telnet и отправив почтовые данные из локального файла в url, и они даже не занимают секунду, поэтому это не проблема с размещенным скриптом на сайте.

Почему он принимает 6 секунд для передачи данных, когда это две простые строки?

Я использую пользовательский класс для передачи данных

class httppostdata 
{ 
    WebRequest request; 
    WebResponse response; 

    public string senddata(string url, string postdata) 
    { 
     var start = DateTime.Now; 
     Console.WriteLine("Starting request at " + start.ToString()); 

     // create the request to the url passed in the paramaters 
     request = (WebRequest)WebRequest.Create(url); 


     // set the method to post 
     request.Method = "POST"; 
     // set the content type and the content length 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = postdata.Length; 
     // convert the post data into a byte array 
     byte[] byteData = Encoding.UTF8.GetBytes(postdata); 
     var end1 = DateTime.Now; 
     Console.WriteLine("Finished creating request : took " + (end1 - start)); 

     var start2 = DateTime.Now; 
     Console.WriteLine("Transmitting data at " + start2.ToString()); 
     // get the request stream and write the data to it 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteData, 0, byteData.Length); 
     dataStream.Close(); 
     var end2 = DateTime.Now; 
     Console.WriteLine("Transmitted the data : took " + (end2 - start2)); 


     // get the response 
     var start3 = DateTime.Now; 
     Console.WriteLine("Getting the response at " + start3.ToString()); 


     response = request.GetResponse(); 
     //Console.WriteLine(((WebResponse)response).StatusDescription); 
     dataStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(dataStream); 
     var end3 = DateTime.Now; 
     Console.WriteLine("Getting response " + (end3 - start3)); 

     // read the response 
     string serverresponse = reader.ReadToEnd(); 
     var end3a = DateTime.Now; 
     Console.WriteLine("Finished response " + (end3a - start3)); 

     Console.WriteLine("Entire call took " + (end3a - start)); 

     //Console.WriteLine(serverresponse); 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

     return serverresponse; 
    } 
} 

И называть его я использую

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    // string postdata; 

    if (txtUsername.Text.Length < 3 || txtPassword.Text.Length < 3) 
    { 
     MessageBox.Show("Missing your username or password."); 
    } 
    else 
    { 
     string postdata = "username=" + txtUsername.Text + 
          "&password=" + txtPassword.Text; 

     httppostdata myPost = new httppostdata(); 
     string response = myPost.senddata("http://www.domainname.com/scriptname.php", postdata); 
     MessageBox.Show(response); 
    } 
} 
+0

Я понимаю, что это http в вашем примере, но в вашем фактическом шестисекундном тестовом сценарии есть URL https? Может быть накладные расходы из-за рукопожатия, проверки CRL, вызова OCSP и т. Д. –

ответ

0

Скорее всего, потому, что в тесте, вы вызываете только один раз, задержка вы видите код C#, составленный JIT.

Лучшим испытанием было бы назвать это дважды, и сбросить тайминги с первого раза и посмотреть, лучше ли они.

Еще лучше было бы отбросить первый набор таймингов, а затем запустить это много раз и принять среднее значение, хотя для очень «индикативного» представления это, вероятно, не требуется.

Как в стороне, для такого рода времени вам лучше использовать класс System.Diagnostics.Stopwatch за System.DateTime.

[EDIT] Кроме того, отмечая предложение Mant101 по поводу доверенностей, если не установка прокси-сервера не удается разрешить эту проблему, вы можете настроить Fiddler и настроить запрос использовать Fiddler в качестве прокси-сервера. Это позволит вам перехватить фактические HTTP-вызовы, чтобы вы могли лучше разбить тайм-ауты http из-за пределов фреймворка.

+1

Это неправильно. (1) Метод JIT скомпилирован до его запуска, а не через него. (2) JIT, компилирующий такой короткий метод, не занимает 6 секунд. (3) Время, необходимое для получения таймингов, незначительно по сравнению с 6 секундами. (4) Вы принимаете средние значения, когда вы измеряете короткие, критически важные по времени операции, которые занимают миллисекунды; а не при общении с HTTP-сервером занимает 6 секунд. (5) Хотя точность DateTime.Now не так точна, как секундомер, в диапазоне секунд разница в точности совершенно незначителен. – dtb

+0

1) Этот метод может быть запущен до его запуска, но вы заметите, что он вызывает другие методы. Это * эти *, которые могут быть дроблены, по мере продвижения этого метода. 2) Время, затрачиваемое на JIT, зависит от многих вещей, включая использование текущей памяти (и необходимость выхода страницы), скорость диска и т. Д. Обычно это быстро. Всегда? нет. 3) Я никогда не говорил, что это не было 4) Моя точка зрения - что если этот медленный опыт был вызван чем-то вроде диска IO, усреднение может помочь уменьшить влияние. Я не говорил об усреднении, чтобы удалить дрожание времени. Ваше предположение, а не мое. 5) Я сказал «как общее правило». –

+0

Дополнение к вашей точке 4 - подразумевается, что вы считаете, что 6 секунд связано с общением с HTTP-сервером. Я предлагаю, что этого может не быть. Вы выполняете средние короткие временные операции, чтобы уменьшить влияние джиттера часов и других источников случайной ошибки. Вы также * можете сделать то же самое, чтобы уменьшить воздействие на компьютер вашего компьютера, выполняющего другие задачи, которые не очевидны во время тестирования. Возможно, стоит повторить ту же задачу снова и снова, возможно, в разное время, чтобы устранить последствия скрытых запланированных или других задач. –

4

Убедитесь, что вы явно задали для прокси-ресурса значение WebRequest равным null или попытаетесь автоопределить настройки прокси-сервера, которые могут занять некоторое время.

+0

Если бы в случае с прокси-серверами лучше было бы загружать экран заставки и делать пустой звонок? причина, по которой я спрашиваю, заключается в том, что программное обеспечение используется в нескольких сетях от ноутбуков, а в некоторых сетях используются прокси – 2010-04-22 12:02:50