2013-08-26 74 views
1

我目前正在研究一个可以帮助我用cookies和POST参数创建WebRequest的类。但response.cookies总是空的。我如何获取返回的cookie并将它们发送给下一个请求?WebResponse不返回任何cookies

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; 
    } 
} 
+0

如果有一个重定向然后是,你不会得到任何cookie,试图解析响应报头和u会看到cookies, – K3rnel31

回答

1

如果HttpWebResponse对象的Cookies集合为空,则意味着响应没有新的cookies。要访问请求和响应的所有Cookie,然后读取来自HttpWebRequest对象饼干代替,就像这样:

foreach (Cookie newCookie in request.Cookies) 
{ 
    // Do something with cookies here for next request 
} 
+0

我以为我会在响应中获得所有的cookie,并且必须将相同的cookie放入下一个请求中?你的例子会在请求中提供所有的cookies(这意味着没有cookies,因为没有人设置它们)。我想保留旧的响应中的cookie,并将其添加到下一个请求中! –

+0

那么,如果您的请求中没有Cookie,并且响应中没有Cookie,那么您将没有Cookie。 –

4

由于this.cookies最初为null,您的代码将不会进入循环

foreach (KeyValuePair<string, Cookie> pair in this.cookies) 
{ 
    Console.WriteLine(" Sent cookie: " + pair.Value.Name + " = " + pair.Value.Value); 
    request.CookieContainer.Add(pair.Value); 
} 

不好的一部分,你永远不会看到request.CookieContainer为空(否则你会得到空引用异常),这会告诉你什么是错的。

由于request.CookieContainer为空,HttpWebResponse从不会获取返回的cookie。

解决方案:简单,只需添加

if (request.CookieContainer == null) 
     request.CookieContainer = new CookieContainer(); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address); 

PS:你可能需要阅读this question约在C#中的命名约定。

PS2:在使用变量名request不提高可读性的方法request

+0

但现在我可以接收cookie并添加到下一个请求中,但是我的php脚本没有看到任何cookie(但在浏览器中一切正常)。我可能需要做域名事情吗? –

+0

非常奇怪的行为......响应对象有一个非null的cookie容器,但没有cookie。这绝对有效。 –

2

我有同样的问题,所以我加了request.AllowAutoRedirect=false;,我可以让饼干:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address); 
... 
request.Method = "POST"; 
request.AllowAutoRedirect=false; 
+0

谢谢!疯狂。 – Stephen