在C#中使用https的HttpWebRequest

这段代码不起作用; 它正在登录使用https协议的网站。 如何解决这个问题呢? 代码在GetRequestStream()随时随地停止,表示协议违规exception未处理。

 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()); } 

在调用GetRequestStream之前将请求方法设置为post

喜欢

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

我的猜测是,您遇到的问题是由于(正如其他人已经建议的那样)您正在执行GET请求而不是POST请求。 另外,我注意到该页面上密码字段的实际名称是“heslo”而不是“密码”。 此拼写错误不会导致Web服务器不返回响应,但它会导致其他问题,因为服务器正在查找要使用密码值发布的特定变量名称。

您可能还想预先确定要发布的内容的总长度,并将其设置为请求的ContentLength。 请参阅MSDN :

在HttpWebRequest类上设置的属性发生冲突时,会在几种情况下抛出ProtocolViolationException。 如果应用程序将ContentLength属性和SendChunked属性设置为true,然后发送HTTP GET请求,则会发生此exception。 如果应用程序尝试将chunked发送到仅支持HTTP 1.0协议的服务器(如果不支持),则会发生此exception。 如果应用程序尝试在未设置ContentLength属性的情况下发送数据,或者在禁用缓冲并且在keepalive连接上(KeepAlive属性为true),SendChunked为false, 则会发生此exception

这对我有用:

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