首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助.NET CookieContainer

帮助.NET CookieContainer
EN

Stack Overflow用户
提问于 2009-12-02 17:30:35
回答 6查看 10.2K关注 0票数 2

最近我在CookieContainer上遇到了一些问题。要么我做了一些严重错误的事情,要么出现了某种bug w/ CookieContainer对象。它似乎没有用特定的Set-Cookie头更新cookie集合。

这可能是一篇冗长的文章,我对此表示赞同,但我希望尽可能做到这一点,所以我将列出我的HTTP嗅探日志和我的实际实现代码。

代码语言:javascript
复制
    public bool SendRequest(HttpWebRequest request, IDictionary<string, string> data, int retries)
    {
        // copy request in case request instance already failed
        HttpWebRequest newRequest = (HttpWebRequest)HttpWebRequest.Create(request.RequestUri);
        newRequest.Method = request.Method;

        // if POST data was provided, write it to the stream
        if (data != null && data.Count != 0)
        {
            StreamWriter writer = new StreamWriter(newRequest.GetRequestStream());
            writer.Write(createPostString(data));
            writer.Close();
        }

        // set request with global cookie container
        newRequest.CookieContainer = this.cookieJar;

        try
        {
            using (HttpWebResponse resp = (HttpWebResponse)newRequest.GetResponse())
            {
                //CookieCollection newCooks = getCookies(resp.Headers);
                //updateCookies(newCooks);
                this.cookieJar = newRequest.CookieContainer;
                this.Html = getResponseString(resp);

             /* remainder snipped */

下面是代码,这是对我在Fiddler中嗅到的响应的两个请求:

请求1

代码语言:javascript
复制
POST /login/ HTTP/1.1
Host: www.site.com
Content-Length: 47
Expect: 100-continue
Connection: Keep-Alive

响应1

代码语言:javascript
复制
HTTP/1.1 200 OK
Date: Wed, 02 Dec 2009 17:03:35 GMT
Server: Apache
Set-Cookie: tcc=one; path=/
Set-Cookie: cust_id=2702585226; domain=.site.com; path=/; expires=Mon, 01-Jan-2011 00:00:00 GMT
Set-Cookie: cust_session=12%2F2%2F2009%20%2012%3A3%3A35; domain=.site.com; path=/; expires=Wed 2-Dec-2009  17:33:35
Set-Cookie: refer_id_persistent=0000; domain=.site.com; path=/; expires=Fri 2-Dec-2011  17:3:35
Set-Cookie: refer_id=0000; domain=.site.com; path=/
Set-Cookie: private_browsing_mode=off; domain=.site.com; path=/; expires=Fri, 01-Jan-2010 17:03:35 GMT
Set-Cookie: member_session=UmFuZG9tSVYL%5BS%5D%5BP%5DfhH77bYaVoS9j9Yd8ySRkyHHz%5BS%5Dk0S8MVsQ6AyraNlcdcCRC0RkB%5BP%5DfBYVM4vn6JQ3HlJxT3GlJi1RZiMGQaITg7HN9dpu9oRbZgMjhJlXXa%5BP%5D7pFSjqDIZWRr3LAfnhh3btv4E3rvVH42CeOP%5BS%5Dx6kDyvrokQEHyIHPGi7zswZbuHrUdx2XKEKKJzw1unDWfw0LZWjoehAs0QgSOz6Nzp8P4Hp8hqrULdIMch6acPT%5BS%5DbKV8zwugBIcjr5dI3rVR%5BP%5Dv42rsTtQB7dyb%5BP%5DRKb8Y83cGqhHM33hP%5BP%5DUtmbDC1PPfr%5BS%5DPC23lAO%5BS%5DmQ3mOy9x4pgQSOfp40XSfzgVg3EavITaxHBeI5nO3%5BP%5D%5BS%5D2rSDthDfuEm4sT9i6UF3sYd1vlOL0IC9ZsVatV1yhhpQ%5BE%5D%5BE%5D; domain=.site.com; path=/; expires=Fri, 01-Jan-2010 17:03:35 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

请求2

代码语言:javascript
复制
GET /test?search=jjkjf HTTP/1.1
Host: www.site.com
Cookie: tcc=one; cust_id=2702585226; private_browsing_mode=off; member_session=UmFuZG9tSVYL%5BS%5D%5BP%5DfhH77bYaVoS9j9Yd8ySRkyHHz%5BS%5Dk0S8MVsQ6AyraNlcdcCRC0RkB%5BP%5DfBYVM4vn6JQ3HlJxT3GlJi1RZiMGQaITg7HN9dpu9oRbZgMjhJlXXa%5BP%5D7pFSjqDIZWRr3LAfnhh3btv4E3rvVH42CeOP%5BS%5Dx6kDyvrokQEHyIHPGi7zswZbuHrUdx2XKEKKJzw1unDWfw0LZWjoehAs0QgSOz6Nzp8P4Hp8hqrULdIMch6acPT%5BS%5DbKV8zwugBIcjr5dI3rVR%5BP%5Dv42rsTtQB7dyb%5BP%5DRKb8Y83cGqhHM33hP%5BP%5DUtmbDC1PPfr%5BS%5DPC23lAO%5BS%5DmQ3mOy9x4pgQSOfp40XSfzgVg3EavITaxHBeI5nO3%5BP%5D%5BS%5D2rSDthDfuEm4sT9i6UF3sYd1vlOL0IC9ZsVatV1yhhpQ%5BE%5D%5BE%5D

因此,正如您所看到的那样,用于每个请求的CookieContainer (this.cookieJar)并不是为refer_id、cust_session、refer_id_persistent选择Set-Cookie头。然而,它确实收集了cust_id,private_browsing_mode,tcc和member_session.知道为什么会这样吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-21 22:17:20

只是想更新这篇文章以防别人发现。问题是.NET符合cookie标签的RFC规范,但并非所有站点都这样做。因此,最终问题不是微软,也不是.NET。(虽然IE很好地管理cookie,所以最好使用相同的解析方法重写他们的.NET cookie解析方法)问题在于不遵循RFC规范的站点。

尽管如此,我经常遇到的一个问题是网站会在cookie的过期日期使用逗号。.NET将它们解释为不同cookie字段之间的分隔符,并在cookie结束后剥离结尾和所有内容。

RFC规范:"Cookie:,后面是以逗号分隔的一个或多个Cookie列表。“对于这个问题,一个简单的解决方案是web服务器根据RFC文档在引号中用逗号括住值。然而,没有RFC警察,所以我们只能希望人们遵守规则。

票数 8
EN

Stack Overflow用户

发布于 2011-01-08 00:20:29

MSDN SetCookies: SetCookies从SetCookies头中提取所有SetCookies,为每个cookie构建一个Cookie,然后将每个Cookie添加到与URI关联的内部CookieCollection中。cookieHeader字符串中的HTTP必须用逗号分隔。

MSDN GetCookieHeader GetCookieHeader返回一个字符串,该字符串保存由uri指定的cookie实例的HTTP头。HTTP头是通过添加与uri关联的每个Cookie的字符串表示来构建的。注意,字符串的确切格式取决于Cookie所遵循的RFC。与uri关联的所有Cookie实例的字符串被组合,由分号分隔。

此字符串的格式不正确,不能用作SetCookies方法的第二个参数。

票数 4
EN

Stack Overflow用户

发布于 2009-12-02 17:45:46

这只是对代码的快速扫描,但在发送请求中的cookie之前,似乎是在发送post数据。

代码语言:javascript
复制
   if (data != null && data.Count != 0)
    {
        StreamWriter writer = new StreamWriter(newRequest.GetRequestStream());
        writer.Write(createPostString(data));
        writer.Close();
    }

    // set request with global cookie container
    newRequest.CookieContainer = this.cookieJar;

可能发生的情况是,当您将post数据写入流时,它将被发送到远程服务器。但是,要设置cookie,必须在任何后期数据之前将其发送到服务器。简单的解决方案是像这样交换它:

代码语言:javascript
复制
 // set request with global cookie container
 newRequest.CookieContainer = this.cookieJar;

 if (data != null && data.Count != 0)
    {
        StreamWriter writer = new StreamWriter(newRequest.GetRequestStream());
        writer.Write(createPostString(data));
        writer.Close();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1834522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档