代理只有一个浏览器CefSharp屏外

问题描述 投票:0回答:3

我想设置一个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();

    }

代理测试

在这里我要创建两个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/SecondBrowserLoadingStateChangedallow我旗时,页面加载,从而完成了对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 =我的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不同的主机?

c# proxy cefsharp
3个回答
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")

0
投票

这是正确的,但使用时(“异步”)记得

   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")  
    }

0
投票

/完美主义模式开

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")  
© www.soinside.com 2019 - 2024. All rights reserved.