在C#中使用https进行HttpWebRequest

时间:2009-02-12 16:08:20

标签: c# .net https httpwebrequest

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

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

4 个答案:

答案 0 :(得分:5)

在调用GetRequestStream

之前,将请求方法设置为post

喜欢

request.Method = "POST";

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您可能还想事先计算出发布内容的总长度,并将其设置为请求的ContentLength。见MSDN

  

在几个案例中设置属性时抛出ProtocolViolationException   HttpWebRequest类是冲突的。如果应用程序设置,则会发生此异常   ContentLength属性和SendChunked属性为true,然后发送HTTP GET   请求。如果应用程序尝试将chunked发送到服务器,则会发生此异常   仅支持HTTP 1.0协议,不支持此功能。 如果出现此异常   应用程序尝试发送数据而不设置ContentLength属性或   禁用缓冲和保持连接时,SendChunked为false(   KeepAlive属性为真。)

答案 3 :(得分:0)

这对我有用:

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