如何使用HttpWebRequest登录网站?

时间:2011-01-31 10:19:18

标签: c# php httpwebrequest

我正在尝试重写一些登录到网站的服务器php代码,使用在C#网站上遍布网络的规范HttpWebRequest用法:

HttpWebRequest BuildPOST(string url, string parameters)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    byte[] bytes = Encoding.ASCII.GetBytes(parameters);
    Stream os = null;
    try
    { 
         request.ContentType = "application/x-www-form-urlencoded";
         equest.ContentLength = bytes.Length;
         os = request.GetRequestStream();
         os.Write(bytes, 0, bytes.Length); 
    }
    catch (WebException ex)
    {
         Console.WriteLine("{0} HttpPost: Request error", ex.Message);
    }
    finally
    {
         if (os != null)
         {
              os.Close();
         }
    }
    return request;
}

使用:

调用
string login_url = "http://www.sailonline.org/community/accounts/login/";
string login_post_data = "next=/windy/run/{0}/&password={1}&username={2}";  // race, pwd, boat
HttpWebRequest req = BuildPOST(login_url, string.Format(login_post_data, race, pwd, user));

最初的php是:

include 'phplib.php';

$url = "http://www.sailonline.org/community/accounts/login/";
$postdata = sprintf("next=/windy/run/%s/&password=%s&username=%s", $race, $key, $boat);
$html = get_pipe_output(build_post_url($url, $postdata));

但是,C#代码不会从php代码生成与服务器相同的响应。相反,我得到一个页面询问登录详细信息(在帖子中正确输入以开始)。

我对网络编程有些新意,似乎无法弄清楚为什么会发生这种情况。我已经从我的代码,服务于php的页面和有问题的网站上的原始登录页面中窥探了数据包,并且在请求之间看不到任何差异,只是从C#代码发出的那个没有有预期的回应 我所能想到的可能是php函数做了我不知道的事情吗?

1 个答案:

答案 0 :(得分:1)

您需要在请求中创建并设置CookieContainer。没有这个,你的要求就不会成功。看起来该页面正在发送带响应的cookie。

HTTP/1.1 200 OK
Date: Mon, 31 Jan 2011 23:53:23 GMT
Server: Apache
Expires: Mon, 31 Jan 2011 23:53:23 GMT
Vary: Cookie
Last-Modified: Mon, 31 Jan 2011 23:53:23 GMT
ETag: "ad806aa693ed8187c278f0fadfa92d01"
Cache-Control: max-age=0
Content-Type: text/html; charset=utf-8
Set-Cookie:  sailonlinesid=bcc2b5fe9980df3e741e8fe7279d61d4; Domain=.sailonline.org; expires=Mon, 14-Feb-2011 23:53:23 GMT; Max-Age=1209600; Path=/
Connection: close