最近使用.net HttpWebRequest 编写winform程序向ASP页面 POST用户登录信息。对方服务器为IIS6,网站为 classic ASP website。因为登录界面上有验证码。实现上先从网站上download 验证码图片,让用户在本地输入,程序再组织参数POST到登录页面上(login.asp)。但结果是每次都得到提示 验证码错误。我的考虑是当访问首页时,服务器建立session,并生成验证码,回传给client。因为我获取验证码图片时是再次GET 图片地址(这会触发再次生成验证码),但是我输入新的验证码并提交后,提示验证码有错。说明是另建了session,原session上的验证码是没变的。看起来是httpwebrequest多次请求会生成多个session。这种情况是在我在HTTP头部写入相同的ASP SESSION ID下发生的。以下是部分代码:
是程序问题?还是.net有特殊的机制? //-----------------------------------------------------------------------------------------
// name: LoadDefaultPage()
// desc: load default page
//
// input:
// string url the home page url
//
// output:
// void
//-----------------------------------------------------------------------------------------
private string LoadDefaultPage(string url)
{
httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.AllowAutoRedirect = false;
httpWebRequest.Accept = "*/*";
httpWebRequest.Headers.Add("Accept-Language", "zh-cn");
httpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout = 300000;
httpWebRequest.Method = "GET";
if ( cookieContainer == null )
{
cookieContainer = new CookieContainer(); // cookieContainer is global variable
} httpWebRequest.CookieContainer = cookieContainer; // get response and save cookie
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); CookieHeader = httpWebResponse.Headers["Set-Cookie"]; // same as response return
//if (CookieHeader != string.Empty)
//{
//cookieContainer.SetCookies(new Uri("http://www.chongka8.com"), httpWebResponse.Headers["Set-Cookie"]);
//} stream = httpWebResponse.GetResponseStream();
streamReader = new StreamReader( stream, Encoding.GetEncoding("gb2312") ); StringBuilder strbuilder = new StringBuilder();
char[] buffer = new char[1024]; while (streamReader.Read(buffer, 0, 1024) != 0)
{
strbuilder.Append(buffer);
} string responseStr = strbuilder.ToString(); // release resource
streamReader.Close();
stream.Close();
httpWebResponse.Close(); // show validating code image
GetRandomImg();
return responseStr;
}
//-----------------------------------------------------------------------------------------
// name: GetRandomImg()
// desc: get random image
//
// input:
// string url the page url
// string datasection string sytle data need to send
//
// output:
// int return value
//-----------------------------------------------------------------------------------------
private void GetRandomImg()
{
if ( httpWebRequest == null )
{
return;
} httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.chongka8.com/include/RandImage.asp?0.24974247575467207");
httpWebRequest.Accept = "*/*";
httpWebRequest.Headers.Add("Accept-Language", "zh-cn");
httpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout = 300000;
httpWebRequest.Method = "GET";
httpWebRequest.CookieContainer = cookieContainer; httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = httpWebResponse.GetResponseStream(); // save image to a file
string filepath = System.Windows.Forms.Application.StartupPath + "\\randomimg.gif";
FileStream filestream = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite );
byte[] buffer = new byte[1024]; while (stream.Read(buffer, 0, 1024) != 0)
{
filestream.Write(buffer, 0, 1024);
filestream.Flush();
} filestream.Close();
stream.Close();
httpWebResponse.Close();
// show the random image
pb_radmimg.Image = Image.FromFile(filepath); }// end GetRandomImg
是程序问题?还是.net有特殊的机制? //-----------------------------------------------------------------------------------------
// name: LoadDefaultPage()
// desc: load default page
//
// input:
// string url the home page url
//
// output:
// void
//-----------------------------------------------------------------------------------------
private string LoadDefaultPage(string url)
{
httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.AllowAutoRedirect = false;
httpWebRequest.Accept = "*/*";
httpWebRequest.Headers.Add("Accept-Language", "zh-cn");
httpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout = 300000;
httpWebRequest.Method = "GET";
if ( cookieContainer == null )
{
cookieContainer = new CookieContainer(); // cookieContainer is global variable
} httpWebRequest.CookieContainer = cookieContainer; // get response and save cookie
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); CookieHeader = httpWebResponse.Headers["Set-Cookie"]; // same as response return
//if (CookieHeader != string.Empty)
//{
//cookieContainer.SetCookies(new Uri("http://www.chongka8.com"), httpWebResponse.Headers["Set-Cookie"]);
//} stream = httpWebResponse.GetResponseStream();
streamReader = new StreamReader( stream, Encoding.GetEncoding("gb2312") ); StringBuilder strbuilder = new StringBuilder();
char[] buffer = new char[1024]; while (streamReader.Read(buffer, 0, 1024) != 0)
{
strbuilder.Append(buffer);
} string responseStr = strbuilder.ToString(); // release resource
streamReader.Close();
stream.Close();
httpWebResponse.Close(); // show validating code image
GetRandomImg();
return responseStr;
}
//-----------------------------------------------------------------------------------------
// name: GetRandomImg()
// desc: get random image
//
// input:
// string url the page url
// string datasection string sytle data need to send
//
// output:
// int return value
//-----------------------------------------------------------------------------------------
private void GetRandomImg()
{
if ( httpWebRequest == null )
{
return;
} httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.chongka8.com/include/RandImage.asp?0.24974247575467207");
httpWebRequest.Accept = "*/*";
httpWebRequest.Headers.Add("Accept-Language", "zh-cn");
httpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout = 300000;
httpWebRequest.Method = "GET";
httpWebRequest.CookieContainer = cookieContainer; httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = httpWebResponse.GetResponseStream(); // save image to a file
string filepath = System.Windows.Forms.Application.StartupPath + "\\randomimg.gif";
FileStream filestream = new FileStream(filepath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite );
byte[] buffer = new byte[1024]; while (stream.Read(buffer, 0, 1024) != 0)
{
filestream.Write(buffer, 0, 1024);
filestream.Flush();
} filestream.Close();
stream.Close();
httpWebResponse.Close();
// show the random image
pb_radmimg.Image = Image.FromFile(filepath); }// end GetRandomImg
参考
2,请求附加码,并显示在自己的页面,注意,请求附加码的时候,一定要用第一步得到的cookie去请求,请求完毕后如果有新的cookie则继续保存。
3,人工输入附加码,post到最终的页面。
------------------------------------------------------------------------------
方法二:1、首先要获得目标网站的cookies,根据不同的网站,你可以使用不同的方法。
一般来讲,你需要先请求验证码所在页面,这样服务器就会把相关的cookies写到你的container里边。
当然,你也可以从本地缓存里边取出来ie已经存放的cookie,不过这个在.net3.0以上平台很好办,在3.0以下平台需要你平台调用API才能获得。
2、简单的就是:
在你的代码中,在请求图片前先请求一下所在的页面。当然,下来请求图片的时候,一定要指定使用同一个CookieContainer对象。
1.cookies.add(HttpWebResponse.cookies);
2.HttpWebRequest.CookieContainer = cookies;
request.CookieContainer = cook;