使用C#从嵌入式表单页面登录和检索数据

时间:2011-07-15 21:49:09

标签: c# asp.net authentication post httpwebrequest

我对如何解决这个问题感到有点困惑,因为我并不熟悉网络内容。我在C#中使用控制台应用程序尝试从password protected homepage内的页面链接中检索值。 I'm using the following details

这是我正在尝试的代码:

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("");
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
req.Method = "POST";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add("Accept-Language: en-us,en;q=0.5");
req.Headers.Add("Accept-Encoding: gzip,deflate");
req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
req.KeepAlive = true;
req.Headers.Add("Keep-Alive: 300");
req.Referer = "copy from url";

req.ContentType = "application/x-www-form-urlencoded";

String Username = copy from url;
String PassWord = copy from url;

StreamWriter sw = new StreamWriter(req.GetRequestStream());
sw.Write(string.Format("&loginname={0}&password={1}&btnSubmit=Log In&institutioncode=H4V9KLUT45AV&version=2", Username, PassWord));
sw.Close();
HttpWebResponse response = (HttpWebResponse)req.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream());
string tmp = reader.ReadToEnd();

但是,当我检查从网页检索到的数据时,它显示如下:

  

'...您的会话由于不活动而超时。请退出并注销   relogin。
返回登录页面>'

我猜这是由于ASP.NET中的一些VIEWSTATE内容 我也猜测我可能会遇到从我将从主页中提取的链接中检索数据的问题,因为看起来链接只是将数据加载到框架中而不是重新加载网页。

有人请吗?

2 个答案:

答案 0 :(得分:1)

您的表单数据不正确。在开始删除&后,它对我有用:

sw.Write(string.Format("loginname={0}&password={1}&btnSubmit=Log In&institutioncode=H4V9KLUT45AV&version=2", Username, PassWord));

此外,正如在其他答案中已经提到的,您需要在对网站的进一步请求中添加返回的ASPSESSIONIDSSRRDRST cookie。

答案 1 :(得分:0)

好的...网站正在使用Cookie,因此,在您登录后,您需要首先检索Cookie,以进行另一次WebRequest:

CookieCollection cookiesResponse = new CookieCollection();

if (response != null)
{
    foreach (string cookie in response.Headers["Set-Cookie"].Split(';'))
    {
        string name = cookie.Split('=')[0];
        string value = cookie.Substring(name.Length + 1);
        cookiesResponse.Add(new Cookie(name.Trim(), value.Trim(), path, domain));
    }
}

在您的示例中,cookie包含:ASPSESSIONIDSSRRDRST = FEKODBMDBEIPCLLENCFLFBEA

您必须将该CookieCollection用于对网络的任何请求,您可以在请求中设置Cookie:

request.CookieContainer = cookiesResponse;

最后,你可以解析回复。您可以使用html标记解析,或解析纯文本。

我希望这有用。