当前位置:编程学习 > C#/ASP.NET >>

HttpWebRequest模拟登录ASP页面 ASP session失效问题

最近使用.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 --------------------编程问答-------------------- 学习,学习,顶  --------------------编程问答-------------------- 大哥,你的回复让我改不了贴子了,呵呵 --------------------编程问答-------------------- webBrowser控件实现
参考 --------------------编程问答-------------------- 顶&…… --------------------编程问答-------------------- 麻烦说明一下好么? --------------------编程问答-------------------- 顶一下 --------------------编程问答-------------------- 大侠都来看看呀 --------------------编程问答-------------------- 我也想做个类似的测试,希望高人回答! --------------------编程问答-------------------- 以下是我google到的方法,希望高手能有示例代码

方法一:

1,请求首页面,获得cookie,并保存cookie备用(注:session 也是cookie的一种) 
2,请求附加码,并显示在自己的页面,注意,请求附加码的时候,一定要用第一步得到的cookie去请求,请求完毕后如果有新的cookie则继续保存。 
3,人工输入附加码,post到最终的页面。 
------------------------------------------------------------------------------
方法二:

1、首先要获得目标网站的cookies,根据不同的网站,你可以使用不同的方法。 
一般来讲,你需要先请求验证码所在页面,这样服务器就会把相关的cookies写到你的container里边。 
当然,你也可以从本地缓存里边取出来ie已经存放的cookie,不过这个在.net3.0以上平台很好办,在3.0以下平台需要你平台调用API才能获得。 
2、简单的就是: 
在你的代码中,在请求图片前先请求一下所在的页面。当然,下来请求图片的时候,一定要指定使用同一个CookieContainer对象。

--------------------编程问答-------------------- 我也遇到相同问题,不知道post时候怎么能包含cookie --------------------编程问答--------------------
引用 10 楼 as300403 的回复:
我也遇到相同问题,不知道post时候怎么能包含cookie

CookieContainer cookies = new CookieContainer();
1.cookies.add(HttpWebResponse.cookies);
2.HttpWebRequest.CookieContainer = cookies; --------------------编程问答-------------------- --------------------编程问答-------------------- 在你的代码里都没有看到cookie.....声明一个cookie,所有的访问都用同一个Cookie就可以了!
request.CookieContainer = cook; --------------------编程问答-------------------- 我也遇到了一样的问题。。 --------------------编程问答-------------------- 你下载 验证码的时候 一般会下载一个cookie的,所以 你下载验证号和post的时候 用统一个CookieContainer 就可以的,定义一个全局的CookieContainer 就OK了 简单 --------------------编程问答-------------------- 你貌似已经定义了一个,你用一个CookieContainer  别人就会认为你是同一个浏览器,你看是不是少了什么参数或者,你请求验证码的时候 CookieContainer 中是否有值,在浏览器上先监控下,检查下
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,