【问题标题】:HttpWebRequest with https in C#C# 中带有 https 的 HttpWebRequest
【发布时间】:2009-02-12 16:08:20
【问题描述】:

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

【问题讨论】:

  • 我没有编辑权限,但您需要在代码示例中混淆用户名和密码变量。我刚尝试登录该网站,他们让我进去了。
  • 将它们替换为“用户”和“通行证”
  • 您还应该在网站上更改您的密码,因为凭据仍在此问题的编辑历史记录中。
  • 谢谢 ppl,但该帐户用于测试目的 -> 我真的不在乎是否有人看到它;-)
  • @Birgit_B:有markdown for that,只有两个反引号。

标签: c# .net https httpwebrequest


【解决方案1】:

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

喜欢

request.Method = "POST";

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我又遇到了一个问题,不确定我是否应该提出另一个问题。我如何继续“使用相同的“记录的 cookie 和数据”从同一服务器的不同页面获取数据?
    • @Skuta:见 HttpWebRequest.CookieContainer:msdn.microsoft.com/en-us/library/…
    【解决方案3】:

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

    当属性设置在 HttpWebRequest 类有冲突。如果应用程序设置了 ContentLength 属性和 SendChunked 属性为 true,然后发送一个 HTTP GET 要求。如果应用程序尝试将分块发送到服务器,则会发生此异常 仅支持 HTTP 1.0 协议,不支持此协议。 如果出现此异常 应用程序尝试发送数据而不设置 ContentLength 属性 或 SendChunked 当缓冲被禁用并且在保活连接上时为假( KeepAlive 属性为真)。

    【讨论】:

    【解决方案4】:

    这对我有用:

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

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2019-01-17
      • 2012-04-02
      • 1970-01-01
      • 2017-02-21
      • 2011-08-27
      • 2012-05-10
      • 2011-01-05
      相关资源
      最近更新 更多