Почему отправка данных с помощью WebRequest занимает так много времени?

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

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

Имя пользователя = тест & пароль = тест  

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

Начиная запрос на 22/04/2010 12:15:42  
Завершено создание запроса: заняло 00:00:00.0570057  
Передача данных в 22.04.2010 12:15:42  
Передал данные: взял 00:00:06.9316931       << -
Получение ответа на 22/04/2010 12:15:49  
Получение ответа 00: 00: 00.0360036  
Законченный ответ 00: 00: 00.0360036  
Весь звонок занял 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);
    }
}

2 ответа

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

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

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

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

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

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

Другие вопросы по тегам