9

这段代码不起作用;它正在登录使用 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

4 回答 4

5

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

request.Method = "POST";

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
    writer.Write("nick=" + username + "&password=" + password);
}
于 2009-02-12T16:18:23.230 回答
3

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

于 2009-02-12T16:33:05.533 回答
1

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

当 HttpWebRequest 类上设置的属性发生冲突时,会在多种情况下引发 ProtocolViolationException。如果应用程序将 ContentLength 属性和 SendChunked 属性设置为 true,然后发送 HTTP GET 请求,则会发生此异常。如果应用程序尝试将分块发送到仅支持 HTTP 1.0 协议的服务器,则会发生此异常,而该协议不受支持。如果应用程序在未设置 ContentLength 属性的情况下尝试发送数据,或者当缓冲被禁用且处于保活连接(KeepAlive 属性为真)时 SendChunked 为假,则会发生此异常。

于 2009-02-12T16:22:20.223 回答
0

这对我有用:

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);
于 2012-01-05T04:57:55.073 回答