C # WebRequest для PHP-скрипта выполнить задачи вставки операторов - PullRequest
0 голосов
/ 12 сентября 2010

Хорошо, в основном

 /// <summary>
        /// Sends the process.
        /// </summary>
        /// <param name="MD5">The M d5.</param>
        /// <param name="procName">Name of the proc.</param>
        /// <param name="procLoc">The proc loc.</param>
        public void SendProcess(string MD5, string procName, string procLoc)
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("http://localhost/EDAC//SubmitProc.php ");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            string postData = "MD5=" + MD5 + "&procName=" + procName + "&procLoc=" + procLoc + "&userID=" + _userID;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
        }

Эта функция вызывается в цикле

Process[] currentProcess = Process.GetProcesses();

                foreach (var process in currentProcess)
                {
                    var isContained = false;

                    foreach (var heldProcess in _processlist)
                    {
                        if (heldProcess.Id == process.Id)
                        {
                            isContained = true;
                        }
                    }
                    if (!(isContained))
                    {

                        try
                        {
                                _processLocs.Add(process.MainModule.FileName);
                                _processlist.Add(process);
                                _tw.WriteLine(process.ProcessName);
                                _tw.WriteLine(process.MainModule.FileName);
                                var md5 = GetMD5HashFromFile(process.MainModule.FileName);
                                _tw.WriteLine(md5);
                                SendProcess(md5, process.ProcessName, process.MainModule.FileName);
                        }
                        catch (Win32Exception ex)
                        {

                        }

                    }
                }

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

Так, как правильно это сделать?Я искал способ запустить цикл, который ждет, пока сервер не будет готов принять больше данных, или он, возможно, отправляет все объекты и обрабатывает их в переменных для вставки на стороне php

1 Ответ

0 голосов
/ 12 сентября 2010

Хорошо, в основном

public void SendProcess(string md5, string procName, string procLoc)
{
    var values = new NameValueCollection
                 {
                     { "MD5",      md5      },
                     { "procName", procName },
                     { "procLoc",  procLoc  },
                     { "userID",   _userID  },
                 };

    using (var client = new WebClient())
    {
        client.UploadValues("http://localhost/EDAC/SubmitProc.php", values);
    }
}

Вы можете вызывать эту функцию в цикле, и она должна работать.

Обратите внимание, как используются ресурсы (здесь: WebClient ) disposed , поэтому последующие вызовы могут повторно использовать одно и то же соединение HTTP (пул соединений).В противном случае вы быстро столкнетесь с множеством открытых соединений, которые невозможно использовать повторно.

Теперь многократное выполнение множества небольших HTTP-запросов гораздо менее эффективно, чем выполнение нескольких более крупных запросов.Вы должны объединить несколько запросов в один и ограничить количество запросов за единицу времени до разумного уровня.Вы можете использовать WebClient.UploadString или WebClient.UploadData для загрузки более сложных данных, чем простые пары ключ / значение.

При этом я бы никогда не хотелУ меня на компьютере есть программное обеспечение, которое отправляет список активных процессов на какой-либо сервер.Я надеюсь, что в вашем приложении есть большое жирное предупреждение, предупреждающее пользователей о вашем вторжении в их конфиденциальность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...