2009-02-12 196 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);