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

C#模拟http请求出错,求大神帮忙

 public static Result doGet(string url, Dictionary<string, string> param, CookieCollection cookies)
        {
            StringBuilder sbParam = new StringBuilder("?");
            if (param != null)
            {
                foreach (KeyValuePair<string, string> kvp in param)
                {
                    sbParam.Append(kvp.Key + "=" + kvp.Value + "&");
                }
            }
            url = url + (null == param ? "" : sbParam.ToString().Substring(0, sbParam.Length - 1));
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            //上面的http头看情况而定,但是下面俩必须加   
            request.KeepAlive = true;
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "GET";
            Encoding encoding = Encoding.UTF8;//根据网站的编码自定义  
            request.CookieContainer = new CookieContainer();
            if (cookies != null)
            {
                request.CookieContainer.Add(cookies);
            }
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader streamReader = new StreamReader(responseStream, encoding);
            string retString = streamReader.ReadToEnd();
            streamReader.Close();
            responseStream.Close();
            Result r = new Result();
            r.Cookie = response.Cookies;
            r.ResString = retString;
            return r;
        }


我用这个方法请求一个地址获得COOKIE然后在第二次请求的时候把COOKIE放进去。但是每次都提示没有COOKIE
第一个是http请求,第二个是https请求。

这个有关系么?求解 --------------------编程问答-------------------- 用fiddler看看在网页面上正常情况下是如何的,
如果中间有302跳转,导致cookie没有回传回来的 --------------------编程问答--------------------
引用 1 楼 zhujiazhi 的回复:
用fiddler看看在网页面上正常情况下是如何的,
如果中间有302跳转,导致cookie没有回传回来的

我第一个请求就是进入http://www.baidu.com/
获得百度的一个COOKIE然后用这个COOKIE进入百度的另一个页面
https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true
如果login_token如果有值就那cookie传入正确,但是每次都提示the fisrt two args should be string type:0,1! --------------------编程问答-------------------- 问琪琪大妈啊 --------------------编程问答--------------------
引用 3 楼 u010006337 的回复:
问琪琪大妈啊
这货说忘了 --------------------编程问答--------------------

顶一下,等大神 --------------------编程问答--------------------
引用 5 楼 mailyxf 的回复:


顶一下,等大神

这是技术区,水货小心删你贴 --------------------编程问答-------------------- 顶一下 ,没做过web
  --------------------编程问答-------------------- http://blog.csdn.net/archerluke/article/details/6310893 --------------------编程问答-------------------- 人工撑起 --------------------编程问答--------------------
引用 8 楼 wind_cloud2011 的回复:
http://blog.csdn.net/archerluke/article/details/6310893

这个cookie获得好像不全
BDSVRTM=0; H_PS_PSSID=3784_4199_1434_4321_4414_4263_4450
另一个Java程序获得的COOKIE
BAIDUID=3ED25B738DA43F24CC0482CD03B23CAE:FG=1;BDSVRTM=0;H_PS_PSSID=1464_4420_4415_4405_4263_445
  --------------------编程问答-------------------- cookie有有效期和域的限制,这两个非常重要,你必须单独处理,而不能直接拿上次获取的cookie用在下次。 --------------------编程问答--------------------
引用 11 楼 qldsrx 的回复:
cookie有有效期和域的限制,这两个非常重要,你必须单独处理,而不能直接拿上次获取的cookie用在下次。

cookie获得后马上就使用的,而且从百度拿到了,第二个页面也是百度的。
我用JavaSE使用没有问题。
C#我不知道错在哪里 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 2 楼 q445697127 的回复:
我第一个请求就是进入http://www.baidu.com/
获得百度的一个COOKIE然后用这个COOKIE进入百度的另一个页面
https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true
如果login_token如果有值就那cookie传入正确,但是每次都提示the fisrt two args should be string type:0,1!

你确定第二个页面的地址没有给错吗?我怎么不管是否登录,打开那个页面都是给我输出一段代码文字,这让我如何测试? --------------------编程问答--------------------
引用 14 楼 qldsrx 的回复:
Quote: 引用 2 楼 q445697127 的回复:

我第一个请求就是进入http://www.baidu.com/
获得百度的一个COOKIE然后用这个COOKIE进入百度的另一个页面
https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true
如果login_token如果有值就那cookie传入正确,但是每次都提示the fisrt two args should be string type:0,1!

你确定第二个页面的地址没有给错吗?我怎么不管是否登录,打开那个页面都是给我输出一段代码文字,这让我如何测试?

要清空cookie,然后直接打开页面就会提示,打开那个页面需要百度的一个COOKIE --------------------编程问答-------------------- 我清空了Cookie的,但是打开的时候,百度会自动分配我2个cookie,打开也没有报错,如果不情况的话,我能查到5个cookie,清空后也可以打开,临时分配我2个cookie而已,而且不论是否清空cookie,打开看到的效果一样(谷歌浏览器测试的)。我想我没必要为了查看cookie的情况,单独写段程序吧,直接浏览器调试效果更好,更能说明情况。 --------------------编程问答-------------------- 好好学习,天天向上 --------------------编程问答-------------------- 原来那个页面是作为jsonp的方式返回的,难怪看起来都是代码,怪怪的。
可以确定一点,你必须提供BAIDUID和H_PS_PSSID这两个Cookie,也只需要这两个,不要多余的。另外这两个Cookie的所属域必须是.baidu.com,不能带www,因为那个涉及到跨域传递Cookie,从www.baidu.com的传递到passport.baidu.com --------------------编程问答--------------------
引用 12 楼 q445697127 的回复:
Quote: 引用 11 楼 qldsrx 的回复:

cookie有有效期和域的限制,这两个非常重要,你必须单独处理,而不能直接拿上次获取的cookie用在下次。

cookie获得后马上就使用的,而且从百度拿到了,第二个页面也是百度的。
我用JavaSE使用没有问题。
C#我不知道错在哪里

既然java能用,为什么还要搞另一种? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 6 楼 q445697127 的回复:
Quote: 引用 5 楼 mailyxf 的回复:



顶一下,等大神

这是技术区,水货小心删你贴

我就是通过这句话的20分的 --------------------编程问答--------------------
引用 21 楼 mailyxf 的回复:
Quote: 引用 6 楼 q445697127 的回复:

Quote: 引用 5 楼 mailyxf 的回复:



顶一下,等大神

这是技术区,水货小心删你贴

我就是通过这句话的20分的
你已经50分了 --------------------编程问答--------------------
引用 22 楼 q445697127 的回复:
Quote: 引用 21 楼 mailyxf 的回复:

Quote: 引用 6 楼 q445697127 的回复:

Quote: 引用 5 楼 mailyxf 的回复:



顶一下,等大神

这是技术区,水货小心删你贴

我就是通过这句话的20分的
你已经50分了


你是说可用分啊 --------------------编程问答--------------------
引用 22 楼 q445697127 的回复:
Quote: 引用 21 楼 mailyxf 的回复:

Quote: 引用 6 楼 q445697127 的回复:

Quote: 引用 5 楼 mailyxf 的回复:



顶一下,等大神

这是技术区,水货小心删你贴

我就是通过这句话的20分的
你已经50分了

用不用我帮你把这个问题解决一下 --------------------编程问答--------------------
引用 24 楼 mailyxf 的回复:
Quote: 引用 22 楼 q445697127 的回复:

Quote: 引用 21 楼 mailyxf 的回复:

Quote: 引用 6 楼 q445697127 的回复:

Quote: 引用 5 楼 mailyxf 的回复:



顶一下,等大神

这是技术区,水货小心删你贴

我就是通过这句话的20分的
你已经50分了

用不用我帮你把这个问题解决一下

解决了有砖厂 --------------------编程问答--------------------  string ckstr = response.Header["Set-Cookie"];

用这种方式  取一下Cookies 试试 --------------------编程问答--------------------
引用 26 楼 mailyxf 的回复:
 string ckstr = response.Header["Set-Cookie"];

用这种方式  取一下Cookies 试试

取cookie没有问题,问题在请求的时候怎么加入cookie,我不知道错哪了,加进去的时候好像少了,第一次请求得到了3个cookie,但是每次赋值的时候只有两个,少了一个BAIDUID的cookie --------------------编程问答-------------------- domain的问题 如果多个二级域名之间共享cookie,则设置domain=dipan.com 不要写 domain=sg7.dipan.com

引用 27 楼 q445697127 的回复:
Quote: 引用 26 楼 mailyxf 的回复:

 string ckstr = response.Header["Set-Cookie"];

用这种方式  取一下Cookies 试试

取cookie没有问题,问题在请求的时候怎么加入cookie,我不知道错哪了,加进去的时候好像少了,第一次请求得到了3个cookie,但是每次赋值的时候只有两个,少了一个BAIDUID的cookie
--------------------编程问答-------------------- 添加cookie的时候,如果删除域名设置,直接报错,因为它不是简单的添加,而是要验证域名是否一致,因此你需要自己判断那个域名,并修改到一致的域名上再添加,我11楼已经提醒过你有域的限制,你却不当回事,18楼更是指出了域的实际内容,你还看不懂问题所在吗? --------------------编程问答--------------------
引用 29 楼 qldsrx 的回复:
添加cookie的时候,如果删除域名设置,直接报错,因为它不是简单的添加,而是要验证域名是否一致,因此你需要自己判断那个域名,并修改到一致的域名上再添加,我11楼已经提醒过你有域的限制,你却不当回事,18楼更是指出了域的实际内容,你还看不懂问题所在吗?

我错啦,待会我就去改。大神不要动怒 --------------------编程问答-------------------- 你的cookie用错了
CookieContainer cookieContainer=new CookieContainer();
HttpWebRequest hp = null;
//把cookie放入当次请求中
hp.CookieContainer = this.cookieContainer;

//响应后把cookie存起来,以便下次请求时用
HttpWebResponse wr = (HttpWebResponse)hp.GetResponse();
cookieContainer.Add(wr.Cookies); --------------------编程问答--------------------  妖孽,还不快快结贴 --------------------编程问答-------------------- --------------------编程问答-------------------- 将cookie 根据分号,分割成多组;然后分别依次加入 --------------------编程问答--------------------
引用 32 楼 mailyxf 的回复:
 妖孽,还不快快结贴

还没搞完,急个毛线 --------------------编程问答--------------------
引用 31 楼 yanglong925319 的回复:
你的cookie用错了
CookieContainer cookieContainer=new CookieContainer();
HttpWebRequest hp = null;
//把cookie放入当次请求中
hp.CookieContainer = this.cookieContainer;

//响应后把cookie存起来,以便下次请求时用
HttpWebResponse wr = (HttpWebResponse)hp.GetResponse();
cookieContainer.Add(wr.Cookies);


我第一次请求的时候有把cookie存到一个对象里,第二次请求的是有有add(cookie)不过CookieContainer 不是同一个这个有关系? --------------------编程问答--------------------
引用 29 楼 qldsrx 的回复:
添加cookie的时候,如果删除域名设置,直接报错,因为它不是简单的添加,而是要验证域名是否一致,因此你需要自己判断那个域名,并修改到一致的域名上再添加,我11楼已经提醒过你有域的限制,你却不当回事,18楼更是指出了域的实际内容,你还看不懂问题所在吗?

域名我已经看过了哪两个都是.baidu.com,所以不是cookie的问题,是C#代码某个地方错啦 --------------------编程问答--------------------
引用 36 楼 q445697127 的回复:
Quote: 引用 31 楼 yanglong925319 的回复:

你的cookie用错了
CookieContainer cookieContainer=new CookieContainer();
HttpWebRequest hp = null;
//把cookie放入当次请求中
hp.CookieContainer = this.cookieContainer;

//响应后把cookie存起来,以便下次请求时用
HttpWebResponse wr = (HttpWebResponse)hp.GetResponse();
cookieContainer.Add(wr.Cookies);


我第一次请求的时候有把cookie存到一个对象里,第二次请求的是有有add(cookie)不过CookieContainer 不是同一个这个有关系?


当然要用同一个啦,因为你第二次请求想用第一次请求的会话
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,