标签: cookiecontainer

将CookieContainer与WebClient类一起使用

我之前使用过带有HttpWebRequest和HttpWebResponse会话的CookieContainer,但现在,我想将它与WebClient一起使用.据我所知,没有像HttpWebRequests(request.CookieContainer)那样的内置方法.如何从CookieContainer中的WebClient收集cookie?

我用Google搜索并找到以下示例:

public class CookieAwareWebClient : WebClient
{
    private readonly CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest webRequest = request as HttpWebRequest;
        if (webRequest != null)
        {
            webRequest.CookieContainer = m_container;
        }
        return request;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?

c# cookies webclient httpwebrequest cookiecontainer

142
推荐指数
5
解决办法
13万
查看次数

C#:将CookieContainer写入磁盘并重新加载以供使用

CookieContainer从一个名为CookieJar的HttpWebRequest/HttpWebResponse会话中提取.我希望我的应用程序在运行之间存储cookie,因此CookieContainer在程序的一次运行中收集的cookie 也将在下一次运行时使用.

我认为这样做的方法是以某种方式将CookieContainer的内容写入磁盘.我的问题是:

  • 你如何写一个CookieContainer到磁盘?是否有内置功能,或者,如果没有,人们采取了哪些方法?有没有可用于简化此类的课程?
  • 一旦你将CookieContainer写入磁盘,你如何重新加载它

UPDATE:第一个答案已经提出系列化CookieContainer.但是,我不太熟悉如何序列化和反序列化这些复杂的对象.你能提供一些示例代码吗?建议是利用SOAPFormatter.

c# cookies file-io httpwebrequest cookiecontainer

28
推荐指数
4
解决办法
2万
查看次数

使用HttpCookieCollection和CookieContainer发送cookie

我想通过HTTP请求从我的服务器隧道到远程服务器,通过所有cookie.所以我创建了一个新HttpWebRequest对象,并希望在其上设置cookie.

HttpWebRequest.CookieContainerSystem.Net.CookieContainer持有的类型System.Net.Cookies.

在我的传入请求对象上:

HttpRequest.CookiesSystem.Web.HttpCookieCollection持有的类型System.Web.HttpCookies.

基本上我希望能够将它们分配给彼此,但不同的类型使它变得不可能.我是否必须通过复制它们的值来转换它们,还是有更好的方法?

.net c# cookies cookiecontainer

25
推荐指数
1
解决办法
2万
查看次数

我怎样才能获得CookieContainer的所有Cookie?

我想使用Newtonsoft.Json将CookieContainer导出到JSON,但遗憾的是CookieContainer没有枚举器或东西,所以我不能循环使用它...

编辑:使用我发布的解决方案,它将是这样的:

private static void Main(string[] args)
{
    CookieContainer cookieContainer = new CookieContainer();
    cookieContainer.Add(new Cookie("name1", "value1", "/", ".testdomain1.com"));
    cookieContainer.Add(new Cookie("name2", "value1", "/path1/", ".testdomain1.com"));
    cookieContainer.Add(new Cookie("name2", "value1", "/path1/path2/", ".testdomain1.com"));
    cookieContainer.Add(new Cookie("name1", "value1", "/", ".testdomain2.com"));
    cookieContainer.Add(new Cookie("name2", "value1", "/path1/", ".testdomain2.com"));
    cookieContainer.Add(new Cookie("name2", "value1", "/path1/path2/", ".testdomain2.com"));

    CookieCollection cookies = GetAllCookies(cookieContainer);

    Console.WriteLine(JsonConvert.SerializeObject(cookies, Formatting.Indented));
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

.net c# cookiecontainer

20
推荐指数
3
解决办法
3万
查看次数

带空域的HttpWebRequest cookie

我有一个ASP.NET MVC操作,通过HttpWebRequest将GET请求发送到另一个服务器.我想在新请求中包含原始操作请求中的所有cookie.原始请求中的某些System.Web.HttpCookies具有空域值(即""),这显然不会导致任何问题.当我使用每个cookie的名称,值,路径和域创建System.Net.Cookie并将其添加到请求的CookieContainer时,我收到此错误:

"System.ArgumentException:参数'{0}'不能是空字符串.参数名称:cookie.Domain"

这里有一些代码会抛出相同的错误(添加cookie时):

var request = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add ( new Cookie ( "MyCookieName", "MyCookieValue", "/", "") );
Run Code Online (Sandbox Code Playgroud)

编辑

有点用"localhost"的域,而不是从原来的HttpCookie空或空字符串值修正了这个.那么,为什么空域不适用于CookieContainer? 并且HttpCookie是否使用空值来表示localhost,或者我是否需要为此问题找到另一个修复程序?

httpwebrequest cookiecontainer

18
推荐指数
3
解决办法
2万
查看次数

CookieContainer错误?

我很困惑CookieContainer如何处理域,所以我创建了这个测试.此测试显示cookieContainer不会返回"example.com"的任何cookie,但根据RFC,它应返回至少2个cookie.

这不是一个bug吗?

如何使它工作?

以下是对此错误的讨论:

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c4edc965-2dc2-4724-8f08-68815cf1dce6

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    CookieContainer getContainer()
    {
        CookieContainer result = new CookieContainer();

        Uri uri = new Uri("http://sub.example.com");
        string cookieH = @"Test1=val; domain=sub.example.com; path=/";
        result.SetCookies(uri, cookieH);

        cookieH = @"Test2=val; domain=.example.com; path=/";
        result.SetCookies(uri, cookieH);

        cookieH = @"Test3=val; domain=example.com; path=/";
        result.SetCookies(uri, cookieH);

        return result;
    }

    void Test()
    {
        CookieContainer cookie = getContainer();
        lblResult.Text += "<br>Total cookies count: " + cookie.Count + " &nbsp;&nbsp; expected: …
Run Code Online (Sandbox Code Playgroud)

c# cookiecontainer

16
推荐指数
1
解决办法
9672
查看次数

使用.net(C#)System.Net.Cookie处理cookie值中的逗号

我正在创建一个访问网站并登录的客户端+自动执行某些任务,但是他们最近更新了他们的cookie(无论出于何种原因......)在其标识cookie中包含逗号.

例如,Cookie将具有与此类似的值:

a,bcdefghijklmnop
Run Code Online (Sandbox Code Playgroud)

问题是,根据msdn,你不能在cookie的值中使用逗号或句点.我正在寻找的是解决这个限制的方法,某种方式使.net的Cookie与逗号的工作很好.我发现服务器确实向客户端发送了一个'SET-COOKIE'标题,我猜这是正在解析的内容,但这似乎也明显给commans和分号带来了特殊的意义(因此限制了.NET内部的类).

但是,IE,Firefox等浏览器如何正确处理cookie(正如他们显然那样,因为网站在我测试过的任何浏览器中都能正常工作.)是否有办法强迫这个在.NET中的行为?

任何帮助将不胜感激,谢谢.

---编辑---

一些额外的信息:

我的代码看起来像这样:

request = (HttpWebRequest)WebRequest.Create(URI); 
request.CookieContainer = Program.client.cookieJar;
Run Code Online (Sandbox Code Playgroud)

其中cookieJar在Program.client中定义为:

CookieContainer cookieJar = new CookieContainer();
Run Code Online (Sandbox Code Playgroud)

当我遍历并打印出CookieContainer中的所有cookie时,我得到这样的结果:( cookies,格式为:"name" - >"value")

"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a" 
"bcdefghijklmnop" -> "" 

// What I should get is this: 
"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a,bcdefghijklmnop" 
Run Code Online (Sandbox Code Playgroud)

问题的核心似乎是逗号和半冒号是SET-COOKIE标题字符串中的保留字符...但是那么浏览器如何处理这个?我可以自己解析字符串,但我不知道如何绕过这样的情况:( HTTP标头,格式为:"name" - >"value")

"Set-Cookie" -> "messedup_cookie=a,bcdefghijklmnop; path=/; domain=.domain.com; expires=Sat, 15-Aug-2009 09:14:24 GMT,anothervariable=i am the value;"
Run Code Online (Sandbox Code Playgroud)

如您所见,expires部分查找逗号而不是分号,以区别于下一个变量.据我所知,它的格式如下:

cookie1_var1=value; cookie1_var2=value,cookie2_var1=value; cookir2_var2=value
Run Code Online (Sandbox Code Playgroud)

但如果这是真的,是否有一种优雅的方式来处理可能出现在其中一个值中的逗号?

.net c# cookies httpclient cookiecontainer

14
推荐指数
2
解决办法
1万
查看次数

.NET System.Net.CookieContainer线程安全吗?

  1. .NET类System.Net.CookieContainer线程是否安全?- 更新:交钥匙回答 -
  2. 有没有办法确保在异步请求期间修改的变量的线程安全性(即HttpWebRequest.CookieContainer)?
  3. 是否有任何属性可以突出显示线程安全类?- 更新:如果在MSDN上描述了线程安全性,那么可能它们没有此属性 -
  4. 所有.NET类都是安全的吗?- 更新: Marc回答 -

我问这些问题是因为我在多线程代码中的异步请求中使用CookieContainer.我不能把一个异步请求放在一个锁中.也许我必须像F#一样使用只读"变量"(或不可变类型),对吗?

.net multithreading asynchronous thread-safety cookiecontainer

11
推荐指数
2
解决办法
2517
查看次数

在WebBrowser中使用CookieContainer中的cookie

有没有什么方法可以实际使用cookie容器中的cookie(以前从WebRequest中获取)并在WebBrowser控件中使用它们?如果是这样,我该怎么做?这适用于C#中的Winforms应用程序.

.net c# webbrowser-control cookiecontainer winforms

10
推荐指数
1
解决办法
4万
查看次数

powershell httpwebrequest GET方法cookiecontainer问题?

我正在试图抓住一个拥有用户身份验证的网站.我能够发一个POST来发送我的登录信息并存储一个cookie.但是,登录后,我在尝试访问受保护的页面时收到403错误.

$url = "https://some_url"

$CookieContainer = New-Object System.Net.CookieContainer

$postData = "User=UserName&Password=Pass"

$buffer = [text.encoding]::ascii.getbytes($postData)

[net.httpWebRequest] $req = [net.webRequest]::create($url)
$req.method = "POST"
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
$req.Headers.Add("Accept-Language: en-US")
$req.Headers.Add("Accept-Encoding: gzip,deflate")
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7")
$req.AllowAutoRedirect = $false
$req.ContentType = "application/x-www-form-urlencoded"
$req.ContentLength = $buffer.length
$req.TimeOut = 50000
$req.KeepAlive = $true
$req.Headers.Add("Keep-Alive: 300");
$req.CookieContainer = $CookieContainer
$reqst = $req.getRequestStream()
$reqst.write($buffer, 0, $buffer.length)
$reqst.flush()
$reqst.close()
[net.httpWebResponse] $res = $req.getResponse()
$resst = $res.getResponseStream()
$sr = new-object IO.StreamReader($resst)
$result = $sr.ReadToEnd()
$res.close()



$url2 = "https://some_url/protected_page"

[net.httpWebRequest] $req2 = [net.webRequest]::create($url2) …
Run Code Online (Sandbox Code Playgroud)

powershell httpwebrequest httpwebresponse cookiecontainer

9
推荐指数
1
解决办法
3万
查看次数