仅使用CefSharp Offscreen的一个浏览器的代理

时间:2018-02-04 21:39:45

标签: c# proxy cefsharp

我正在尝试为ChromiumWebBrowser()设置代理而不更改其他浏览器的设置。

我的代码如下所示:

CEF初始化

这里我将初始化CefSharp并调用将测试设置代理

的方法
public CFTryOut()
    {
        var settings = new CefSettings()
        {
            CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache"),
        };

        CefSharpSettings.ShutdownOnExit = true;

        Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);

        ProxyTest();

    }

ProxyTest

在这里,我想创建两个ChromiumWebBrowser()并将代理设置为仅其中一个

async Task ProxyTest()
    {
        ChromiumWebBrowser firstbrowser = new ChromiumWebBrowser();
        ChromiumWebBrowser secondbrowser = new ChromiumWebBrowser();

        waitini:
        if (!firstbrowser.IsBrowserInitialized && !secondbrowser.IsBrowserInitialized)
        {
            Thread.Sleep(100);
            goto waitini;
        }

        firstbrowser.LoadingStateChanged += FirstBrowserLoadingStateChanged;
        secondbrowser.LoadingStateChanged += SecondBrowserLoadingStateChanged;

        OpenSync("http://icanhazip.com/", firstbrowser);
        string x = await firstbrowser.GetBrowser().MainFrame.GetSourceAsync();

        //Set the Proxy
        await Cef.UIThreadTaskFactory.StartNew(delegate
        {
            var rc = firstbrowser.GetBrowser().GetHost().RequestContext;
            var v = new Dictionary<string, object>();
            v["mode"] = "fixed_servers";
            v["server"] = "http://45.77.248.104:8888";
            string error;
            bool success = rc.SetPreference("proxy", v, out error);
        });

        OpenSync("http://icanhazip.com/", firstbrowser);
        string y = await firstbrowser.GetBrowser().MainFrame.GetSourceAsync();

        OpenSync("http://icanhazip.com/", secondbrowser);
        string z = await secondbrowser.GetBrowser().MainFrame.GetSourceAsync();


    }

在这里,First/SecondBrowserLoadingStateChanged允许我在页面加载完成时标记,以便OpenSync在返回之前等待页面加载结束:

public void OpenSync(string url, ChromiumWebBrowser browser)
    {
        IsLoading = true;
        browser.Load(url);
        SpinWait.SpinUntil(() => !IsLoading);
    }

我的期望

x =我的ip - xx.xx.xx.xx

y =代理人的IP - 45.77.248.104

z = my ip - xx.xx.xx.xx

我得到了什么

x =我的ip - xx.xx.xx.xx

y =代理人的IP - 45.77.248.104

z =代理人的IP - 45.77.248.104

问题是我没有在secondbrowser上设置任何代理,但请求通过代理。我想这是因为他们共享同一个主机。

所以

1)如何为每个ChromiumWebBrowser指定专用代理?

2)如何为每个新ChromiumWebBrowser指定不同的主机?

3 个答案:

答案 0 :(得分:3)

感谢@amaitland,实际上很容易。

我的问题是我在浏览器初始化后尝试设置RequestContext,而它只读。

但它可以作为构造函数中的参数传递:

        var rc1 = new RequestContext();
        ChromiumWebBrowser firstbrowser = new ChromiumWebBrowser("", null, rc1);
        var rc2 = new RequestContext();
        ChromiumWebBrowser secondbrowser = new ChromiumWebBrowser("", null, rc2);

所有归功于Amaitland

对于更可重用的方式,设置代理的过程可以这样逐出:

    async private Task SetProxy(ChromiumWebBrowser cwb, string Address)
    {
        await Cef.UIThreadTaskFactory.StartNew(delegate
        {
            var rc = cwb.GetBrowser().GetHost().RequestContext;
            var v = new Dictionary<string, object>();
            v["mode"] = "fixed_servers";
            v["server"] = Address;
            string error;
            bool success = rc.SetPreference("proxy", v, out error);
        });
    }

然后我可以致电:

SetProxy(firstbrowser, "123.123.123.123:1234")

答案 1 :(得分:0)

是的,但是使用(“ asyn”)时请记住

   async private Task SetProxy(ChromiumWebBrowser cwb, string Address)
    {
        await Cef.UIThreadTaskFactory.StartNew(delegate
        {
            var rc = cwb.GetBrowser().GetHost().RequestContext;
            var v = new Dictionary<string, object>();
            v["mode"] = "fixed_servers";
            v["server"] = Address;
            string error;
            bool success = rc.SetPreference("proxy", v, out error);
        });
    }

样品使用:

   public async void dd1()
    {
      await SetProxy(firstbrowser, "123.123.123.123:1234")  
    }

答案 2 :(得分:0)

/ Perfectionism模式打开

using System.Threading.Tasks;
using System.Collections.Generic;
using CefSharp;

namespace Extensions
{
    public static class WebBrowserExtensions
    {
        public static Task SetProxy(this IWebBrowser webBrowser, string address)
        {
            return Cef.UIThreadTaskFactory.StartNew(() =>
            {
                var context = webBrowser.GetBrowser().GetHost().RequestContext;

                context.SetPreference("proxy", new Dictionary<string, object>
                {
                    ["mode"] = "fixed_servers",
                    ["server"] = address
                }, out _);
            });
        }
    }
}

用法:

await browser.SetProxy("111.111.111.111:1111")