C#同会话下商品加购后结算失败问题求助
问题分析与解决方案
嘿,这个问题我之前也踩过坑!核心原因是你现在的两个HttpWebRequest属于完全独立的会话——网站是通过Cookie来识别用户、关联购物车的,你加购商品时服务器返回的会话Cookie,没有带到后续的结算请求里,所以服务器会把你当成新用户,自然购物车是空的,直接返回首页了。
要解决这个问题,你需要用CookieContainer在两个请求之间共享会话Cookie,具体调整如下:
- 先创建一个全局的
CookieContainer实例,用来存储会话相关的所有Cookie - 给加购请求和结算请求都设置
CookieContainer属性为这个实例,让两个请求归属同一会话 - 另外注意你的post数据里有
✓这种特殊字符,用Encoding.ASCII编码会导致乱码,建议换成Encoding.UTF8 - 还有个小细节:你之前拼接post参数时没加
&分隔符,服务器解析参数会出错,这个也要修正
下面是修改后的完整代码:
// 创建CookieContainer,用于在请求间共享会话Cookie var cookieContainer = new CookieContainer(); // 加购商品请求 var request = (HttpWebRequest)WebRequest.Create(url_add_to_cart); request.CookieContainer = cookieContainer; // 关联Cookie容器 var postData = "utf8=✓"; postData += "&style=" + data_style_id; // 用&分隔参数,避免解析错误 postData += "&size=" + size; postData += "&commit=add to basket"; var data = Encoding.UTF8.GetBytes(postData); // 改用UTF8编码特殊字符 request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); // 结算请求 var url_checkout = link_general + "/checkout.json"; var request2 = (HttpWebRequest)WebRequest.Create(url_checkout); request2.CookieContainer = cookieContainer; // 关联同一个Cookie容器,保持会话 var postData2 = "utf8=✓"; postData2 += "&order[billing_name]=toto"; // 同样用&分隔参数 postData2 += "&order[email]=toto@gmail.com"; var data2 = Encoding.UTF8.GetBytes(postData2); request2.Method = "POST"; request2.ContentType = "application/x-www-form-urlencoded"; request2.ContentLength = data2.Length; using (var stream2 = request2.GetRequestStream()) { stream2.Write(data2, 0, data2.Length); } var response2 = (HttpWebResponse)request2.GetResponse(); var responseString2 = new StreamReader(response2.GetResponseStream()).ReadToEnd(); Console.WriteLine(responseString2);
这样调整后,加购和结算请求就会共享同一个会话,服务器就能识别到你的购物车内容了。
内容的提问来源于stack exchange,提问作者lucky simon
相关产品推荐
相关产品推荐

