首页 新闻 会员 周边

windows mobile 6 通过httpwebrequest 调用web api 接口获取cookie的问题

0
悬赏园豆:100 [待解决问题]

windows mobile 6 通过httpwebrequest 调用web api 接口获取cookie的问题,
报错信息为:此请求需要数据缓冲以便成功进行身份验证或重定向。


首先与调用接口这块,验证时通过了,但是获取response的时候,由于 compact netframework 类库里,封装的 httpwebrequest 和httpwebresponse 都没有将cookie封装进去,所以在 request.GetResponse() 的时候,转换不了,因为接口返回的流里面,是有cookie的。

现在问题就是,怎么通过httpwebrequest 获取这个cookie

下面我贴出主代码。

 public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent,
            Encoding requestEncoding)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            if (requestEncoding == null)
            {
                throw new ArgumentNullException("requestEncoding");
            }

            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

            request.Method = "POST";

            request.Headers.Add("X_REG_CODE", "288a633ccc1");//注册码
            request.Headers.Add("X_MACHINE_ID", "a306b7c51254cfc5e22c7ac0702cdf87");//硬件标识号
            request.Headers.Add("X_REG_SECRET", "de308301cf381bd4a37a184854035475d4c64946");//系统标为符
            request.Headers.Add("X_STORE", "0001");//
             request.Headers.Add("X_BAY", "0001-01"); //工位
            request.Headers.Add("X-Requested-With", "XMLHttpRequest");
            request.ContentType = "application/x-www-form-urlencoded";

           //request.ContentType = "multipart/form-data";
            request.Headers.Add("Accept-Language", "zh-CN");
            request.Headers.Add("Accept-Encoding", "gzip, deflate");
            request.Accept = "*/*";

            request.AllowWriteStreamBuffering = false;
            request.KeepAlive = true;
  if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            else
            {
                request.UserAgent = DefaultUserAgent;
            }

            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            //如果需要POST数据  
            if (!(parameters == null || parameters.Count == 0))
            {
                StringBuilder buffer = new StringBuilder();
                int i = 0;
                foreach (string key in parameters.Keys)
                {
                    if (i > 0)
                    {
                        buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                    }
                    else
                    {
                        buffer.AppendFormat("{0}={1}", key, parameters[key]);
                    }
                    i++;
                }
                byte[] data = requestEncoding.GetBytes(buffer.ToString());


                request.ContentLength = data.Length;
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }               
            }
            HttpWebResponse res;
            try
            {
//错误就在下面这句,报错 此请求需要数据缓冲以便成功进行身份验证或重定向。
                res = (HttpWebResponse)request.GetResponse();

              
            }
            catch (WebException ex)
            {
                res = (HttpWebResponse)ex.Response;

            }

            return res;
        }
船长他爹的主页 船长他爹 | 初学一级 | 园豆:102
提问于:2013-11-20 17:00
< >
分享
所有回答(2)
0
           HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
       CookieContainer cookie = new CookieContainer(); cookie.Add(); request.CookieContainer = cookie;

给request添加Cookies的方法就是上面那样的,至于Cookie里要加什么这就看你的需求来了

Zery | 园豆:6151 (大侠五级) | 2013-11-20 17:35

我题目里面已经写清楚了 ,compact framework 类库里面对HttpWebRequest的封装太简单,并没有将

CookieContainer 和cookie 封装进去,所以你上面的方法是不行的,注意是windows mobile 开发

不是winform 开发,不过还是谢谢你,你的这个在winform里面可行,在windows mobile里面不行。

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-21 09:27
0

Mobile开发很早前有弄过,仔细看了一下你的问题,还是没有明白你碰到的问题是什么,Cookie实际上传递的过程都是在Request和Response的Header里,要发送Cookie,只需要在Request的Header里加上Cookie就可以了,要获取Response的Cookie,读取Response的Header的Set-Cookie就能找到了。

I,Robot | 园豆:9783 (大侠五级) | 2013-11-21 23:49

有代码吗?

我的问题是,读取Response的时候会报错

也就是这一步

 res = (HttpWebResponse)request.GetResponse();

因为转换不了 Response 所以没有办法获取Set-Cookie

Request的header里面怎么加Cookie?

HttpWebResponse里面没有Cookie这个属性,我怎么获取

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-22 16:12

@船长他爹: 

HttpWebRequest request = WebRequest.Create("http://www.rainier-soft.com/login") as HttpWebRequest;
request.Headers.Add("cookie", "user=rainier-soft.com");
var response = request.GetResponse();
string cookie = response.Headers.Get("Set-Cookie");
using (Stream stream = response.GetResponseStream()) {
    StreamReader reader = new StreamReader(stream);
    string text = reader.ReadToEnd();
}
支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-11-22 20:49

@Rainier-Soft.Com: 上面的代码在WM6.5里是可以正常执行的,可以提交cookie,也可以获取到cookie。

支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-11-22 20:50

@Rainier-Soft.Com: 

我的为什么不行,我的设备的系统也是WM6.5,刚按照你的方法试了一下,还是报上面的错误。

我的web api 页面上调用没问题,所以不是接口问题。

还是我这段代码有问题,大哥帮我再看看,费心了哈

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-25 09:16

@船长他爹: http://bbs.csdn.net/topics/390250352

看看这里的最后一个回复对你有没有用

支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-11-25 10:44

@Rainier-Soft.Com: 

这个我试过,没用0.0

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-25 12:01

@船长他爹: 那就看看能不能抓包,看返回的数据是什么内容导致抛异常。

支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-11-25 14:25

@Rainier-Soft.Com: 

这段代码 在winform程序里面是可以的,winform里面的.netFrameWork 里面是有封装Cookie类的。

但是VM 6.5的类库 Compact FrameWork里面并没有封装 Cookie。

 

我觉得错误就在这里

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-25 15:31

@船长他爹: 上面不是都说过了嘛,Cookie在传递的过程中只是Header里的一项数据,我给你的代码在WM6.5里也实际运行过,提交了Cookie,也能接收Cookie,所以可以确定不是有没有封装Cookie的问题。

支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-11-25 15:48

@Rainier-Soft.Com: 

你给的代码没用,cookie是http协议里面的,compact netFrameWork 类库没有封装这个,缺少cookie这个东西,导致着不能强制转换

(HttpWebResponse)request.GetResponse();

你这段代码要是放在winform程序里面,铁定没什么问题,但是WM里面不行

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-27 15:09

@船长他爹: 不是都跟你说了嘛,这段代码我是在WM6.5的环境里运行通过了的,可以在Request.Header里提交Cookie,可以在Response.Header里拿到服务器返回的Cookie,所以你的问题可能不是Cookie的问题。

支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-11-27 22:38

@Rainier-Soft.Com: 那问题出在哪里?

要不你执行以下我的这段代码试试?

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-28 14:00

@Rainier-Soft.Com: 

难道是没有身份验证?

支持(0) 反对(0) 船长他爹 | 园豆:102 (初学一级) | 2013-11-28 14:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册