我正在尝试重写一些登录到网站的服务器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函数做了我不知道的事情吗?
答案 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