gpt4 book ai didi

c# - 将 cookie 从一个 WebClient 复制到另一个 WebClient?

转载 作者:行者123 更新时间:2023-12-02 13:44:56 31 4
gpt4 key购买 nike

我想知道是否可以将 cookie 从一个 Web 客户端复制到另一个 Web 客户端。

原因

我正在使用并行 Web 请求,它会在每个新线程上创建 Web 客户端的新实例。

问题

信息敏感,需要使用post请求进行授权并保存cookie。所以基本上那些新的Web客户端实例无法访问。我不想授权正在创建的每个 Web 客户端,因此我想知道是否可以以某种方式将 Cookie 从一个 Web 客户端复制到另一个 Web 客户端。

示例代码

public class Scrapper
{
CookieAwareWebClient _web = new CookieAwareWebClient();

public Scrapper(string username, string password)
{
this.Authorize(username, password); // This sends correct post request and then it sets the cookie on _web
}

public string DowloadSomeData(int pages)
{
string someInformation = string.Empty;

Parallel.For(0, pages, i =>
{
// Cookie is set on "_web", need to copy it to "web"
var web = new CookieAwareWebClient(); // No authorization cookie here
html = web.DownloadString("http://example.com/"); // Can't access this page without cookie

someInformation += this.GetSomeInformation(html)
});

return someInformation;
}
}

// This is cookie aware web client that I use
class CookieAwareWebClient : WebClient
{
private CookieContainer cookie = new CookieContainer();

protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = cookie;
}
return request;
}
}

最佳答案

相信你可以分享CookieContainer WebClient之间的实例对象。因此,一旦您通过身份验证,请重新使用相同的 CookieContainer对于您创建的每个新客户。请注意,您的后续请求不会修改 CookieContainer ,否则您可能会遇到竞争条件,因为我怀疑该类对于并行修改来说是线程安全的。

首先修改CookieAwareWebClient使用可以传入 cookie 容器的自定义构造函数。此外,提供一种通过属性获取容器引用的方法:

class CookieAwareWebClient : WebClient
{
private CookieContainer cookie;

public CookieContainer Cookie { get { return cookie; } }

public CookieAwareWebClient() {
cookie = new CookieContainer();
}

public CookieAwareWebClient(CookieContainer givenContainer) {
cookie = givenContainer;
}
}

然后你的Scrapper类应该传入它自己的 CookieContainer身份验证后发送给每个客户端:

public string DowloadSomeData(int pages)
{
string someInformation = string.Empty;
CookieContainer cookie = this._web.Cookie;

Parallel.For(0, pages, i =>
{
// pass in the auth'ed cookie
var web = new CookieAwareWebClient(cookie);
html = web.DownloadString("http://example.com/");

someInformation += this.GetSomeInformation(html)
});

return someInformation;
}

关于c# - 将 cookie 从一个 WebClient 复制到另一个 WebClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212148/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com