C# 向网站post参数并存储cookie

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 向网站post参数并存储cookie相关的知识,希望对你有一定的参考价值。

public string SendDataByPost(string Url,string postDataStr,ref CookieContainer cookie) HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); if (cookie.Count == 0) request.CookieContainer = new CookieContainer(); cookie = request.CookieContainer; else request.CookieContainer = cookie; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postDataStr.Length; Stream myRequestStream = request.GetRequestStream(); StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312")); myStreamWriter.Write(postDataStr); myStreamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); string retString= myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString;

从网上搜的一段代码,运行时这一个会报错 HttpWebResponse response = (HttpWebResponse)request.GetResponse();

我想问这个函数返回的是什么,是post之后的html,还是post之后的cookie??

还有是不是我用错了,这个函数怎么用。刚开始没有参数时这个参数怎么填
ref CookieContainer cookie

这是返回远程响应的,如果远程服务器无响应这里会出错
cookie 这个没有不用填写,返回的 cookie 可以从 Response 里获取
这里建议添加一个 try...catch 以捕获错误进行处理追问

不写cookie,那调用的时候怎么调用呢?
还有返回的retString是什么东西啊

追答

在调用之前,新建一个 CookieContainer,然后传入

  CookieContainer cookie = new CookieContainer();
  SendDataByPost(strUrl, strPostData, ref cooie);

retString 是使用 UTF-8 解码的返回内容

追问

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
上面这一句报错
“System.Net.WebException”类型的未经处理的异常在 System.dll 中发生
其他信息: 远程服务器返回错误: (405) 不允许的方法。
??

追答

这说明服务器不允许 POST 数据,或者发送的数据不正确等其他原因,服务器直接返回错误

参考技术A Cookie可以在POST之前生成或者在POST之后生成,Cookie只会在本地存储。

C# 模拟登录网站的cookie问题

使用httpwebrequest post用户名密码来获取页面的查看权限,在使用get来获取需要的内容.
现在做好是输入要查询的内容后,先post用户名密码再get内容,怎样才能保持cookie,实现只用登录1次就行?
就是程序开始运行时post一次 。每次输入要查询的内容直接get就可以了?
另外,如果cookie超时,get目标页面会报500错误,C#中如何检查服务器状态,以实现超时后在次post?
主要是cookie传值的问题 比如我在Form_Load提交post获得cookie,我没办法在button里面调用啊 怎样才能调用到这个cookie?ref 是不是还是每次都要先请求post?

另外 500错误 程序会直接出错,而不返回html内容哦

1. post登录之后获得CookieContainer,以后每次get的时候用这个CookieContainer登录

post方法大致如下
public static string SendData(string method, string Url, byte[] data, ref CookieContainer cookie, string encoding, string refer)

string retString = "";
try

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
if (cookie.Count == 0)

request.CookieContainer = new CookieContainer();
cookie = request.CookieContainer;

else

request.CookieContainer = cookie;


//实际处理

catch (Exception e)

throw e;

return retString;


get 方法大致如下
public static string SendData(string Url, ref CookieContainer cookie, string encoding, string refer)

return SendData("get", Url, null, ref cookie, encoding, refer);


2. 根据返回的html值进行判断,如果包括了500错误,重新post即可追问

主要是cookie传值的问题 比如我在Form_Load提交post获得cookie,我没办法在button里面调用啊 怎样才能调用到这个cookie?ref 是不是还是每次都要先请求post?

另外 500错误 程序会直接出错,而不返回html内容哦

追答

1. 这个CookieContainer变量可以设置为窗体的成员,比如下面

public partial class Form1 : Form

private CookieContainer cookie;

public Form1()

InitializeComponent();


private void Form1_Load(object sender, EventArgs e)





2. 在SendData中加异常处理,一旦抛出异常则返回html为string.Empty,你的应用程序获得为空时就应该重新get和post了

追问

添加private CookieContainer cookie;
调用时提示错误 “非静态的字段、方法或属性“WindowsFormsApplication1.Form1.cookie”要求对象引用”

追答

如果你是静态方法调用就应该是
private static CookieContainer cookie;

参考技术A 将取得的cookie 在以后的每次请求中都带上追问

关键是怎么传递这个cookie啊...不知道怎么做

追答

请求时指定Header属性

Headers.Add(HttpRequestHeader.Cookie, cookie);

参考技术B 同意1楼的 在请求时一定要把CookieContainer带上

以上是关于C# 向网站post参数并存储cookie的主要内容,如果未能解决你的问题,请参考以下文章

php curl 模拟post表单向提交数据

C#带cookie Post和Get方式发送数据,保持cookie

用C#破解Chrome浏览器cookie值

idhttp提交post带参数并带上cookie

PHP 用CURL POST后获取cookis并跳转到另一个页面

C#:带有 POST 参数的 HttpClient