C#模拟请求,模拟登录,Cookie设置、文件上传等问题汇总

时间:2022-06-22 05:45:07

  由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件。在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助。因为技术有限,可能有些内容并不完全正确或者理解有偏差,希望大家不要见怪,有不同的想法可以留言,我们共同学习,这也是我开始写博客的初衷之一。

  模拟请求,首先我觉得我们需要明确的是,模拟那些请求,我们模拟请求要完成那些操作,就拿我上面的功能来说,我需要模拟登录某个网站,然后打开固定的页面,输入关键字,查找相关信息,然后上传所需要的文件。那么这一系列就是需要我模拟完成的请求。为什么这么说呢,因为做过模拟登录的人可能知道,打开一个网站,他会有很多的请求,你不可能逐一的完成所有的请求,我们只需要模拟完成我们需要的几个请求就可以了。搞清楚我们需要模拟那些请求,接下来我们就可以开发了。

  因为工作的特殊性,无法将我开发的项目拿出来讲解,所以我就将具体问题跟大家分享一下。

  一、请求头的的设置:

    对于一个特定的网站,一般而言,请求头大致是相同的,因此我们可以设置一个统一的请求头,这么做的好处详细大家能够想的到。定义好这个请求头后,在以后的请求中可以直接把collection当做参数传递下去就可以了。

NameValueCollection collection = new NameValueCollection(); collection.Add("Accept","text/html, application/xhtml+xml, */*"); collection.Add("Accept-Encoding","gzip, deflate"); collection.Add("Accept-Language","zh-CN"); collection.Add("UserAgent","Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");

  二、HttpWebRequest和HttpWebResponse的创建,以及模拟请求:在此我把我项目中完成用户登录的模拟请求代码贴出来供大家参考

  

 HttpWebRequest requestLoginToPage = (HttpWebRequest)WebRequest.Create(Url);//创建HttpWebRequest对象               
                requestLoginToPage.Headers.Add(collection);//添加定义好的请求头
                requestLoginToPage.Referer = Url;//重定向地址
                requestLoginToPage.ContentType = "application/x-www-form-urlencoded";
                requestLoginToPage.Host = IP;
                requestLoginToPage.Headers.Add("Pragma", "no-cache");
                requestLoginToPage.Headers.Add("DNT","1");
                requestLoginToPage.KeepAlive = true;//保持连接
                requestLoginToPage.CookieContainer =cookieContainer;//设置Cookie的值
                requestLoginToPage.Method = "POST";//请求方法,有POST和GET两种
                requestLoginToPage.AllowAutoRedirect = false;//禁止页面重定向,在这里禁止重定向是因为要取当前请求响应头中的值,所以才禁止重定向
                //login
                //账户 密码
                if (username == null) { username = ""; }
                if (psw == null) { psw = ""; }
                string data = "";
          //请求参数,每个网站传递参数的形式不一样,具体情况要分析抓取结果,有的可能会进行特殊的编码处理,有的会在后边加时间戳,我使用Fiddle4抓包的,使用方法后期博文中会贴出
                data = "username=" + username + "&password=" + psw + "&scope=&lt=" + lt + "&_eventId=submit";
                if (data != null)//if之内的是对于需要传递参数特定的形式,我也不太清楚为什么要这么写,有知道的可以告诉我
                {
                    byte[] bytes = Encoding.ASCII.GetBytes(data);
                    requestLoginToPage.ContentLength = bytes.Length;
                    Stream streamLoginToPage = requestLoginToPage.GetRequestStream();
                    streamLoginToPage.Write(bytes, 0, bytes.Length);
                    streamLoginToPage.Flush();
                    streamLoginToPage.Close();
                }
         //响应请求
                HttpWebResponse responseLoginToPage = (HttpWebResponse)requestLoginToPage.GetResponse();
         //这是得到响应请求中的Location的值,前边禁止重定向就是为了得到它。
          string Locathion = responseLoginToPage.Headers["Location"].ToString();