C#用HttpClient类post get,怎么设置cookies

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#用HttpClient类post get,怎么设置cookies相关的知识,希望对你有一定的参考价值。

自实现的cookie 验证,远程取值的例子

以下代码配合HttpClient使用可以实现跨域(cookie的读写)
//验证

复制代码代码如下:

HttpClient httpClient = new HttpClient(url, null, true);
httpClient.PostingData.Add(key,value);//登录用户名
httpClient.PostingData.Add(key,value);//密码
string str = httpClient.GetString();

----写文件 序列化传回来的cookie

复制代码代码如下:

CookieCollection cookies = httpClient.Context.Cookies;//保存一个全局的cookie文件
FileStream fileStream = new FileStream("xxx.dat", FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(fileStream, cookies);
fileStream.Close();

--读文件 反序列化cookies 赋给httpClient的cookies

复制代码代码如下:

FileStream fileStream = new FileStream("xxx.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryFormatter b = new BinaryFormatter();
CookieCollection cookies = b.Deserialize(fileStream) as CookieCollection;
HttpClient httpClient = new HttpClient("url");//取值的url
httpClient.Context.Cookies = cookies;
string str = httpClient.GetString();
参考技术A 你百度下cookiecontainer,希望对你有帮助

C# HttpClient 不发送 POST 变量

【中文标题】C# HttpClient 不发送 POST 变量【英文标题】:C# HttpClient not sending POST variables 【发布时间】:2015-03-31 18:18:54 【问题描述】:

我正在尝试制作一个应用程序,它将向https://owlexpress.kennesaw.edu/prodban/bwckschd.p_get_crse_unsec 发送一个带有一些信息的 POST 请求并返回一个类列表。

您可以在此处搜索“我正在使用 2015 年秋季,数学,课程 1190”。 https://owlexpress.kennesaw.edu/prodban/bwckschd.p_disp_dyn_sched

当我运行下面的代码时,它会将返回的内容输出到一个字符串中,该字符串会进入 webbrowser 组件。它显示:

Class Schedule Search    
Fall Semester 2015
Mar 31, 2015
Stop You must select at least ONE subject . 

我使用 Chrome 调试来查找 POST 值并将它们设置为我正常使用该站点时的值。我什至添加了一些 cookie 以备不时之需。

编辑:

好的,新问题。我使用的浏览器的作品,得到了这一点:“term_in = 201508&sel_subj =哑sel_day =哑sel_schd =哑sel_insm =哑SEL_C放=哑sel_levl =哑sel_sess =哑sel_instr =哑sel_ptrm =哑sel_attr = d ummy&sel_subj =数学与sel_crse = 1190 sel_title = sel_insm =%25&sel_from_cred = sel_to_cr ed=&sel_camp=%25&sel_levl=%25&sel_ptrm=%25&sel_instr=%25&begin_hh=0&begin_mi=0&be‌​gin_ap=a&end_hh=0&end_mi=0&end_ap=a"

我不能发送它,因为它使用了一些名称两次,比如 sel_subj(这些是我在字典中的键值)

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net.Http;
using System.Net;

namespace ClassChecker

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window

    methods methods1 = new methods();

    public MainWindow()
    
        InitializeComponent();

    

    private void Button_Click(object sender, RoutedEventArgs e)
                
        string temp = methods1.getData2();
        Console.ReadLine();
        webBrowser.NavigateToString(temp);            
    



public class methods


    public string getData2()
    
        var cookieContainer = new CookieContainer();
        using (var handler = new HttpClientHandler()  CookieContainer = cookieContainer )
        using (var client = new HttpClient(handler))
        
            client.BaseAddress = new Uri("https://owlexpress.kennesaw.edu");

             var values = new Dictionary<string, string>
            
                "sel_subj", "MATH" ,
                "term_in", "201508" ,
                "sel_day", "dummy",
                "sel_schd", "dummy",
                "sel_insm", "%",
                "sel_camp", "%",
                "sel_levl", "%",
                "sel_sess", "dummy",
                "sel_instr", "%",
                "sel_ptrm", "%",
                "sel_attr", "dummy",                   
                "sel_crse", "1190" ,
                "sel_title", "" ,
                "sel_from_cred", "" ,
                "sel_to_cred", "" ,
                "begin_hh", "0" ,
                "begin_mi", "0" ,
                "begin_ap", "a" ,
                "end_hh", "0" ,
                "end_mi", "0" ,
                "end_ap", "a" 

            ;
            var content = new FormUrlEncodedContent(values);

            cookieContainer.Add(client.BaseAddress, new Cookie("SESSID", "MFlIU0VSMTgxNjYx"));
            cookieContainer.Add(client.BaseAddress, new Cookie("BIGipServerowlexpress-all", "2239289986.0.0000"));

            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
            var result = client.PostAsync("/prodban/bwckschd.p_get_crse_unsec", content).Result;
            string resultContent = result.Content.ReadAsStringAsync().Result;                
            MessageBox.Show(result.Headers.ToString());
            return resultContent;
        

    




【问题讨论】:

您是否能够确认(例如使用 Fiddler)表单 POST 参数没有正确输出?问题可能只是您的请求内容有问题,而不是发出请求的代码... @JimW 我在 fiddler 中找到了这个,所以我猜它正在向他们发送“sel_subj=MATH&term_in=201508&sel_day=dummy&sel_schd=dummy&sel_insm=%25&sel_camp=%25&sel_levl=%25&sel_sess=dummy&sel_instr=%25&sel_ptrm=%25&sel_ptrm=% =dummy&sel_crse=1190&sel_title=&sel_from_cred=&sel_to_cred=&begin_hh=0&begin_mi=0&begin_ap=a&end_hh=0&end_mi=0&end_ap=a" 好的,新问题。我使用的浏览器的作品,得到了这一点:“term_in = 201508&sel_subj =哑sel_day =哑sel_schd =哑sel_insm =哑sel_camp =哑sel_levl =哑sel_sess =哑sel_instr =哑sel_ptrm =哑sel_attr =哑sel_subj =数学与sel_crse = 1190 sel_title = sel_insm =%25&sel_from_cred = sel_to_cred = sel_camp =%25&sel_levl =%25&sel_ptrm=%25&sel_instr=%25&begin_hh=0&begin_mi=0&begin_ap=a&end_hh=0&end_mi=0&end_ap=a" 我不能发送它,因为它使用了一些名称两次,比如 sel_subj (这些是我在字典中的关键值)。 我怀疑这些虚拟值是否被考虑在内,它们可能会被忽略(因为它们是第一个)。您是否尝试过使用自己的 HTML 表单来获得正确的请求?例如。我为你开始了 jsfiddle.net/6fe2zxff 只需填写其余字段 Bleh,我做了这个,但在这里也不起作用:http://jsfiddle.net/6fe2zxff/1/ 【参考方案1】:

根据我们在 cmets 中的讨论,您发布到的服务需要一组具有“虚拟”值的参数和另一组具有实际值的相同参数。

如果您使用 NameValueCollection 作为进入 FormUrlEncodedContent 构造函数的参数,您将能够使用重复键。然后它应该可以工作

【讨论】:

感谢您的帮助,我添加了所有的虚拟类型并且它工作正常!

以上是关于C#用HttpClient类post get,怎么设置cookies的主要内容,如果未能解决你的问题,请参考以下文章

C# HttpClient 不发送 POST 变量

C# HttpClient(包含Post和Get)

c# 使用HttpClient的post,get方法传输json

c# 使用HttpClient的post,get方法传输json

httpclient302重定向怎么做

C#怎么用Socket模拟 HTTP请求