2010-09-12 60 views
0

好基本C#的WebRequest到PHP腳本執行INSERT語句的問題

/// <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端

回答

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上傳比簡單鍵/值對更復雜的數據。

也就是說,我絕對不想在我的機器上安裝一個軟件,它將活動進程列表發送到某個服務器。我希望你在你的應用程序中有一個大的警告,警告用戶你的隱私侵犯。

+0

它不會被任何人使用,但它會是,它的測試反作弊應用程序,非常感謝:) – lee 2010-09-12 15:30:07