2012-11-09 50 views
1

我目前正在自動化一個用於管理FTP用戶的Web界面。HttpWebRequest的序列

我試圖用HttpWebRequest來做到這一點,我有一個電話記錄我在網站上,第二個電話是添加一個新的FTP用戶。

我已經在瀏覽器中試過我的兩個網址,他們工作,他們最終創建一個用戶。

string login = "https://www.ftpsite.net/./panel/index.php?txvUsername=myaccount&txvPassword=myPassword&submitButton=Login"; 

這讓我登錄時,當我在瀏覽器地址欄中輸入它。

第二次創建用戶的調用如下。

string createUser = "https://www.ftpSite.net/panel/ftpsites/updatelogin?login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email="; 

這就造成當我在瀏覽器的地址欄中輸入該用戶,如果它遵循我們登錄了一個。

我的問題是,我想這一點使用HttpWebRequest和沒有做成功。我可以讓自己登錄,但是當我嘗試創建用戶時,它似乎會返回一個「錯誤」錯誤代碼,說我已經創建了太多的用戶,但這並不是這種情況,因爲我可以在該調用之後創建更多用戶。下面是代碼我用HtttpRequest

 _datCookie = new CookieContainer(); 
     HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(login); 
     httpWebRequest.Method = "POST"; 
     httpWebRequest.CookieContainer = _datCookie; 

     WebResponse response = httpWebRequest.GetResponse(); 
     referer = response.ResponseUri.AbsoluteUri; 

     Stream requestStream = response.GetResponseStream(); 
     StreamReader streamReader = new StreamReader(requestStream); 
     _datCookie = httpWebRequest.CookieContainer; 
     response.Close(); 



     httpWebRequest = (HttpWebRequest)WebRequest.Create(createUser); 
     httpWebRequest.CookieContainer = _datCookie; 
     httpWebRequest.Referer = referer; 
     httpWebRequest.Method = "POST"; 


     response = httpWebRequest.GetResponse(); 

     requestStream = response.GetResponseStream(); 
     streamReader = new StreamReader(requestStream); 


     webBrowser.DocumentText = streamReader.ReadToEnd(); 

     response.Close(); 

我抓住了,並試圖沒有成功here模仿。

+0

如果你的錯誤是從FTP站點,然後你我們需要看看這個。您的請求可能沒有任何問題。這是您控制的網站,還是第三方FTP站點? – Bobson

+0

它的第三方網站,我認爲問題是在請求中,因爲如果我在瀏覽器的地址欄中寫入url和查詢字符串它的作品。 –

+0

請小提琴手,並分析您的請求從瀏覽器和您的http請求。最終服務不知道您如何生成請求,除非它們存在差異。它應該是假的用戶ID和所有其他參數,如內容長度,內容類型等請發送請求。請讓我知道結果是什麼。 –

回答

1

你確定他們應該是POST請求嗎?這些網址似乎包含查詢字符串中的所有字段,這表明它們應該是GET請求。

基礎上提琴手的屏幕截圖,您需要在體內的領域,而不是查詢字符串的POST請求:

var cookies = new CookieContainer(); 

// Request 1 : Login 
var request = (HttpWebRequest)WebRequest.Create("https://www.ftpsite.net/./panel/index.php"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.CookieContainer = cookies; 

string postData = "txvUsername=myaccount&txvPassword=myPassword&submitButton=Login"; 
byte[] postBytes = Encoding.Default.GetBytes(postData); 
request.ContentLength = postBytes.Length; 
using (Stream bod = request.GetRequestStream()) 
{ 
    body.Write(postBytes, 0, postBytes.Length); 
} 

WebResponse response = request.GetResponse(); 
string referer = response.ResponseUri.AbsoluteUri; 

// Request 2 : Create user 
request = (HttpWebRequest)WebRequest.Create("https://www.ftpSite.net/panel/ftpsites/updatelogin"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.CookieContainer = cookies; 

postData = "login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email="; 
postBytes = Encoding.Default.GetBytes(postData); 
request.ContentLength = postBytes.Length; 
using (Stream bod = request.GetRequestStream()) 
{ 
    body.Write(postBytes, 0, postBytes.Length); 
} 

response = request.GetResponse(); 
requestStream = response.GetResponseStream(); 
streamReader = new StreamReader(requestStream); 
webBrowser.DocumentText = streamReader.ReadToEnd(); 
response.Close(); 
+0

當我用Firebug檢查它的Post請求時,我只是不知道如何通過參數否則。 –

+0

@ dr-denis-mccraclejizz:如果您在Firebug中看到POST請求,這表明它是由您加載的頁面啓動的AJAX請求。如果是這樣的話,你需要考慮從你的代碼中再現*那個請求。 –

+0

不是一個HttpWebRequest一個好方法嗎? –