C#WebRequest到php脚本执行插入语句问题

时间:2010-09-12 13:31:05

标签: c# .net httpwebrequest

好吧基本上

 /// <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)
                        {

                        }

                    }
                }

基本上这个方法在我的本地主机上就好了,而不是在web服务器上,现在这个方法显然不是空闲的,考虑到程序首次加载时你得到大约30个连接请求和半秒内发送的消息,它基本上会锁定,可能由于没有连接。

那么这样做的正确方法是什么?我一直在寻找一种方法来获得循环,等待服务器准备好接收更多数据,或者它是否可能发送所有对象并将其处理为插入php端的变量

1 个答案:

答案 0 :(得分:0)

好吧基本上

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)是处置,因此后续调用可以重复使用相同的HTTP连接(连接池)。否则,您很快就会遇到许多无法重复使用的打开连接。

现在,反复发出大量小型HTTP请求的效率远远低于发出一些较大的请求。您应将多个请求合并为一个请求,并将每个时间单位的请求数限制为合理的级别。您可以使用WebClient.UploadStringWebClient.UploadData上传比简单键/值对更复杂的数据。

那就是说,我永远不想在我的机器上安装一个软件,将活动进程列表发送到某个服务器。我希望你的应用程序中有一个很大的警告警告用户你的隐私侵犯。