在C#中使用Https的HttpWebRequest

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

2
我没有编辑权限,但你需要在你的代码示例中混淆用户名和密码变量。我刚试着登录了这个网站,他们让我进去了。 - regex
用“user”和“pass”替换它们。 - Rytmis
6
您应该在网站上更改密码,因为凭据仍然在此问题的编辑历史记录中。 - Sean Bright
谢谢大家,但这个账户是用于测试目的的 - >我并不真的在意是否有人看到它;-) - Skuta
@Birgit_B:有[markdown](http://stackoverflow.com/editing-help#code)可以实现,只需要两个反引号。 - H.B.
4个回答

5

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

例如:

request.Method = "POST";

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

3

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


谢谢,我还有一个问题,不确定是否应该提出另一个问题。如何继续使用相同的“登录cookie和数据”从相同服务器的不同页面获取数据? - Skuta
1
@Skuta:请查看HttpWebRequest.CookieContainer:http://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.cookiecontainer.aspx - Rytmis

1

在发送请求之前,您可能还想事先确定要发布的内容的总长度,并将其设置为请求的ContentLength。请参见MSDN

当HttpWebRequest类上设置的属性冲突时,会抛出ProtocolViolationException异常。如果应用程序将ContentLength属性和SendChunked属性设置为true,然后发送HTTP GET请求,则会发生此异常。如果应用程序尝试向仅支持HTTP 1.0协议的服务器发送分块,则会发生此异常,因为该协议不支持此操作。如果应用程序在禁用缓冲并且处于保持活动连接(KeepAlive属性为true)的情况下未设置ContentLength属性或SendChunked为false,则会发生此异常。


我应该只做“strlen”检查吗? - Skuta
@skuta - 这是来自 MSDN 的一个样例,网址为 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.contentlength.aspx - Ramesh

0

这是对我有效的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接