使用HTTPWebRequest在C#中登录网站

3

我正尝试登录这个网站:https://lms.nust.edu.pk/portal/login/index.php

以下是我的代码:

   const string uri = "https://lms.nust.edu.pk/portal/login/index.php";
    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(uri);
    wr.KeepAlive = true;
    wr.Method = "POST";
    wr.AllowAutoRedirect = false;
    wr.Proxy = p;
    wr.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
    wr.ContentType = "application/x-www-form-urlencoded";
    wr.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36";
    string pdata = "username=USERNAME&password=PASSWORD";
    byte[] data = UTF8Encoding.UTF8.GetBytes(pdata);
    wr.ContentLength = data.Length;
    CookieContainer cookie = new CookieContainer();
    wr.CookieContainer = cookie;
    using (Stream poststream = wr.GetRequestStream())
    {
        poststream.Write(data, 0, data.Length);
    }
    HttpWebResponse wp = (HttpWebResponse)wr.GetResponse();
    wr.CookieContainer.Add(wp.Cookies);

网站无法通过登录页面。以下是已知的情况。在wp.Cookies中没有任何cookie。我调试了代码,结果发现尽管我已经指定了uri并设置了AllowAutoRedirect=false,但它仍然不能前往该uri和另一个URL。我不知道为什么或如何解决。


也许这可以帮助:https://dev59.com/52855IYBdhLWcg3ww3Sa - TGH
1个回答

8
这应该可以解决您的问题,或者至少给您指明正确的方向。您也可以下载 Fiddler 来帮助调试 HttpRequests...
string param = "username=MyUserName&password=123456";
string url = "https://lms.nust.edu.pk/portal/login/index.php";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentLength = param.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = new CookieContainer();

using (Stream stream = request.GetRequestStream())
{
    byte[] paramAsBytes = Encoding.Default.GetBytes(param);
    stream.Write(paramAsBytes, 0, paramAsBytes.Count());
}

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    foreach (var cookie in response.Cookies)
    {
        var properties = cookie.GetType()
                               .GetProperties()
                               .Select(p => new 
                               { 
                                   Name = p.Name, 
                                   Value = p.GetValue(cookie) 
                               });

        foreach (var property in properties)
        {
            Console.WriteLine ("{0}: {1}", property.Name, property.Value);
        }
    }
}

我收到的回应是...
Comment: 
CommentUri: 
HttpOnly: False
Discard: False
Domain: lms.nust.edu.pk
Expired: False
Expires: 01/01/0001 00:00:00
Name: MoodleSession
Path: /
Port: 
Secure: False
TimeStamp: 31/10/2014 00:13:58
Value: f6ich1aa2udb3o24dtnluomtd3
Version: 0

所以Cookie也被返回了...

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