2009-02-12 198 views
9

這段代碼不起作用;它正在登錄到使用https協議的網站。如何解決這個問題呢?該代碼停在GetRequestStream()隨時隨地說,協議違反異常是未處理..HttpWebRequest with https in C#

string username = "user"; 
string password = "pass"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://moje.azet.sk/prihlasenie.phtml?KDE=www.azet.sk%2Findex.phtml%3F"); 
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)"; 

Console.WriteLine(request.GetRequestStream()); 

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
{ 
    writer.Write("nick=" + username + "&password=" + password); 
} 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
//Retrieve your cookie that id's your session 
//response.Cookies 

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    Console.WriteLine(reader.ReadToEnd()); 
} 
+2

我沒有編輯權限的,但是你需要在混淆你的代碼示例中的用戶名和密碼的變量。我只是嘗試登錄到網站,他們讓我進來。 – regex 2009-02-12 16:15:11

+0

用「用戶」和「通過」取代他們 – Rytmis 2009-02-12 16:19:53

+6

你也應該改變你的網站密碼,因爲憑證仍然在這個問題的編輯歷史記錄。 – 2009-02-12 16:20:44

回答

5

設置請求方法後,調用GetRequestStream

request.Method = "POST"; 

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
{ 
    writer.Write("nick=" + username + "&password=" + password); 
} 
1

之前,您可能也想圖在發佈內容的總長度之前,將其設置爲請求的ContentLength。見MSDN

一個ProtocolViolationException在幾種情況下拋出時的屬性上 HttpWebRequest類設置是相互矛盾的。如果應用程序將 ContentLength屬性和SendChunked屬性設置爲true,則會發生此異常,然後發送HTTP GET 請求。如果應用程序嘗試將分塊發送到服務器,則該異常會發生, 僅支持HTTP 1.0協議,但不支持此協議。 如果 應用程序在未設置ContentLength屬性或 的情況下嘗試發送數據,則在緩衝被禁用且保持連接( KeepAlive屬性爲true)時SendChunked爲false。

3

我的猜測是你遇到的問題是由於事實(像其他人一樣)建議你正在做GET請求而不是POST請求。另外,我注意到該頁面上密碼字段的實際名稱是「heslo」而不是「password」。這個錯字不會導致Web服務器不返回響應,但由於服務器正在查找要使用密碼值發佈的特定變量名稱,它將導致其他問題。

0

這裏對我來說是什麼工作:

var request = WebRequest.Create(_url); 
    request.PreAuthenticate = true; 
    request.Credentials = new NetworkCredential(_userName, _password);