如何在C#的Cookie容器中删除/更新一个Cookie?

5

我使用WebBrowser控件打开一个网站,然后将cookie保存在cookieContainer中,稍后使用HTTPWebRequest处理向前浏览的页面等操作。

问题出现在当我搜索并返回100页时,在第一页上,它保存了一个名为ABC的cookie,我将其添加到cookiecontainer中并移动到下一页,在第二页上,同样的cookie名为ABC被赋予一些值,但现在我在cookiecontainer中有两个相同的cookie,当我移动到下一页时它不起作用,因为它正在采用第一个cookie,这会导致一切都混乱。

如何解决这个问题呢?

HttpWEBREQUEST函数:

 public string getHtmlCookies(string url)
    {
        string responseData = "";
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Accept = "*/*";
            request.AllowAutoRedirect = true;
            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
            request.Timeout = 30000;
            request.Method = "GET";
            request.CookieContainer = yummycookies;

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                foreach (Cookie cookie in response.Cookies)
                {
                    string name = string.Empty;
                    name = cookie.Name;
                    string value = cookie.Value;
                    string path = "/";
                    string domain = "www.example.com";
                    yummycookies.Add(new Cookie(name.Trim(), value.Trim(), path, domain));

                }


                Stream responseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(responseStream);
                responseData = myStreamReader.ReadToEnd();
            }
            response.Close();


        }
        catch (Exception e)
        {
            responseData = "An error occurred: " + e.Message;
        }

        return responseData;

    }

你不需要显式地添加响应中的cookies,只要在收到响应后它们就会自动添加到yummycookies中(只要响应没有重定向)。 - Martin Ernst
如果我不添加它们,它甚至无法从第一页移动到第二页。 - confusedMind
yummyCookie 包含登录信息,稍后在页面 1 上使用该 cookie,然后应获取页面 2 上的同名 cookie,这会产生冲突。 - confusedMind
2个回答

7
您可以使用 SetCookies 方法。
var container = new System.Net.CookieContainer();
var uri = new Uri("http://www.example.com");
container.SetCookies(uri,"name=value");
container.SetCookies(uri,"name=value1");

调用GetCookies(uri)将返回一个带有Value=value1的单个cookie。

在您的情况下,代码应该类似于:

var uri = new Uri("http://www.example.com");
yummycookies.SetCookies(uri, response.Headers[HttpResponseHeader.SetCookie]);    

0

在我的情况下,如果存在于容器中,则RePierre的答案会复制cookie。 我改用了以下方法:

cookieContainer.GetAllCookies().FirstOrDefault(x => x.Name == "myCookie").Value = "MyValue";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接