首页 > 解决方案 > 在 AngleSharp.Io 中使用代理和标头

问题描述

我试图让 AngleSharp 同时使用代理和设置标题属性,如下所示:

        var handler = new HttpClientHandler
        {
            Proxy = new WebProxy(ProxyMan.GetProxy()),
            UseProxy = true,
            PreAuthenticate = true,
            UseDefaultCredentials = false
        };
        var requester = new DefaultHttpRequester();
        requester.Headers["User-Agent"] = Tools.GetAgentString();
        requester.Headers["Accept-Language"] = "en-US";
        requester.Headers["Accept-Charset"] = "ISO-8859-1";
        requester.Headers["Content-Type"] = "text/html; charset=UTF-8";
        var config = Configuration.Default
            .WithRequesters(handler)
            .With(requester)
            .WithTemporaryCookies()
            .WithDefaultLoader();
        var context = BrowsingContext.New(config);
        var doc = await context.OpenAsync(Url);

当我添加 Header 请求者时,它停止了代理处理程序的工作。我知道 .WithRequesters() 和 .With() 之间存在一些冲突,但我找不到在同一个请求中执行这两个操作的正确语法。

谢谢。

标签: httpanglesharp

解决方案


是的,我不确定你为什么同时使用两者。

  1. DefaultHttpRequester是来自 AngleSharp 的请求者,并WebClient在下面使用
  2. WithRequesters来自 AngleSharp.Io 并添加了所有可用的请求者(包括HttpClientRequester
  3. WithDefaultLoader如果尚未注册其他请求者,则将加载程序放入配置并注册默认 HTTP 请求者

我认为你想要做的应该是HttpClientRequester直接使用。

        var handler = new HttpClientHandler
        {
            Proxy = new WebProxy(ProxyMan.GetProxy()),
            UseProxy = true,
            PreAuthenticate = true,
            UseDefaultCredentials = false,
            UseCookies = false,
            AllowAutoRedirect = false
        };
        var client = new HttpClient(handler);
        client.DefaultRequestHeaders.Append("User-Agent", Tools.GetAgentString());
        // ... and the others if you want, even though `content-type` etc. should / will be determined by AngleSharp
        var config = Configuration.Default
            .With(new HttpClientRequester(client))
            .WithTemporaryCookies()
            .WithDefaultLoader();
        var context = BrowsingContext.New(config);
        var doc = await context.OpenAsync(Url);

推荐阅读