C# WebResponse不返回任何cookies
我目前正在开发一个类,它可以帮助我创建带有cookies和POST参数的WebRequest。但是response.cookies总是空的。我如何获取返回的cookies并在下一次请求时发送它们C# WebResponse不返回任何cookies,c#,cookies,httpwebrequest,webrequest,C#,Cookies,Httpwebrequest,Webrequest,我目前正在开发一个类,它可以帮助我创建带有cookies和POST参数的WebRequest。但是response.cookies总是空的。我如何获取返回的cookies并在下一次请求时发送它们 class WebHandler { private string lasturl = ""; private Dictionary<string, Cookie> cookies; public string lastContent; public Web
class WebHandler
{
private string lasturl = "";
private Dictionary<string, Cookie> cookies;
public string lastContent;
public WebHandler()
{
cookies = new Dictionary<string, Cookie>();
}
public HttpWebResponse request(string address)
{
lasturl = address;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
foreach (KeyValuePair<string, Cookie> pair in this.cookies)
{
Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value);
request.CookieContainer.Add(pair.Value);
}
request.Method = "GET";
if(lasturl != "")
request.Referer = lasturl;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
foreach (Cookie newCookie in response.Cookies)
{
Console.WriteLine(" new cookie: " + newCookie.Name + " = " + newCookie.Value);
this.cookies[newCookie.Name] = newCookie;
}
lastContent = new StreamReader(response.GetResponseStream()).ReadToEnd();
return response;
}
public HttpWebResponse request(string address, Dictionary<string, string> postParameters)
{
lasturl = address;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
foreach (KeyValuePair<string, Cookie> pair in this.cookies)
{
Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value);
request.CookieContainer.Add(pair.Value);
}
request.Method = "POST";
string postData = "";
foreach (string key in postParameters.Keys)
postData += HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(postParameters[key]) + "&";
byte[] data = Encoding.ASCII.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
foreach (Cookie newCookie in response.Cookies)
{
Console.WriteLine(" new cookie: " + newCookie.Name + " = " + newCookie.Value);
this.cookies[newCookie.Name] = newCookie;
}
lastContent = new StreamReader(response.GetResponseStream()).ReadToEnd();
return response;
}
}
类WebHandler
{
私有字符串lasturl=“”;
私人字典曲奇;
公共内容;
公共WebHandler()
{
cookies=新字典();
}
公共HttpWebResponse请求(字符串地址)
{
lasturl=地址;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(地址);
foreach(此.cookies中的KeyValuePair对)
{
Console.WriteLine(“发送的cookie:+pair.Value.Name+”=“+pair.Value.Value”);
request.CookieContainer.Add(pair.Value);
}
request.Method=“GET”;
如果(lasturl!=“”)
request.Referer=lasturl;
HttpWebResponse=(HttpWebResponse)request.GetResponse();
foreach(响应中的Cookie newCookie.Cookies)
{
Console.WriteLine(“新cookie:+newCookie.Name+”=“+newCookie.Value”);
this.cookies[newCookie.Name]=newCookie;
}
lastContent=newstreamreader(response.GetResponseStream()).ReadToEnd();
返回响应;
}
公共HttpWebResponse请求(字符串地址、字典后参数)
{
lasturl=地址;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(地址);
foreach(此.cookies中的KeyValuePair对)
{
Console.WriteLine(“发送的cookie:+pair.Value.Name+”=“+pair.Value.Value”);
request.CookieContainer.Add(pair.Value);
}
request.Method=“POST”;
字符串postData=“”;
foreach(postParameters.Keys中的字符串键)
postData+=HttpUtility.UrlEncode(键)+“=”+HttpUtility.UrlEncode(后参数[key])+”&”;
byte[]data=Encoding.ASCII.GetBytes(postData);
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=data.Length;
Stream requestStream=request.GetRequestStream();
requestStream.Write(数据,0,数据长度);
requestStream.Close();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
foreach(响应中的Cookie newCookie.Cookies)
{
Console.WriteLine(“新cookie:+newCookie.Name+”=“+newCookie.Value”);
this.cookies[newCookie.Name]=newCookie;
}
lastContent=newstreamreader(response.GetResponseStream()).ReadToEnd();
返回响应;
}
}
如果HttpWebResponse
对象的Cookies
集合为空,则表示响应没有新Cookies。要访问请求和响应的所有cookie,请改为从HttpWebRequest
对象读取cookie,如下所示:
foreach (Cookie newCookie in request.Cookies)
{
// Do something with cookies here for next request
}
由于
this.cookies
最初为空,因此您的代码永远不会进入循环
foreach (KeyValuePair<string, Cookie> pair in this.cookies)
{
Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value);
request.CookieContainer.Add(pair.Value);
}
之后
PS:您可能想了解c#中的命名约定
PS2:在方法
request
中,使用变量名request
并不能提高可读性。我也有同样的问题,所以我添加了request.AllowAutoRedirect=false代码>,现在我可以获取cookies:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
...
request.Method = "POST";
request.AllowAutoRedirect=false;
我想我会在响应中得到所有cookies,并且必须在下一个请求中放入相同的cookies?您的示例显示请求中的所有cookie(这意味着没有cookie,因为没有人设置它们)。我想保留旧响应中的cookies,并将其添加到下一个请求中!如果请求中没有cookie,响应中没有cookie,那么就永远不会有cookie。但是现在我可以接收cookie并将添加到下一个请求中,但是我的php脚本没有看到任何cookie(但在浏览器中一切正常)。我可能要处理域?非常奇怪的行为…响应对象有一个非空的cookie容器,但没有cookie。这确实有效。如果有重定向,那么是的,你不会得到任何cookies,尝试解析响应头,你会看到cookies,
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
...
request.Method = "POST";
request.AllowAutoRedirect=false;