CefSharp 3 set proxy at Runtime

后端 未结 4 1458
执念已碎
执念已碎 2020-12-10 17:09

I downloaded CEF (chromuim embedded framework) binary distributation that comes with (cefclient & cefsimple) c++ examples, And Realized that cefclient can change proxy s

4条回答
  •  一向
    一向 (楼主)
    2020-12-10 17:55

    I downloaded CefSharp.WinForms 65.0.0 and made class, that can help to start working with proxy:

    public class ChromeTest
    {
        public static ChromiumWebBrowser Create(WebProxy proxy = null, Action onInited = null)
        {
           var result = default(ChromiumWebBrowser);
            var settings = new CefSettings();
            result = new ChromiumWebBrowser("about:blank");
            if (proxy != null)
                result.RequestHandler = new _requestHandler(proxy?.Credentials as NetworkCredential);
    
            result.IsBrowserInitializedChanged += (s, e) =>
            {
                if (!e.IsBrowserInitialized)
                    return;
    
                var br = (ChromiumWebBrowser)s;
                if (proxy != null)
                {
                    var v = new Dictionary
                    {
                        ["mode"] = "fixed_servers",
                        ["server"] = $"{proxy.Address.Scheme}://{proxy.Address.Host}:{proxy.Address.Port}"
                    };
                    if (!br.GetBrowser().GetHost().RequestContext.SetPreference("proxy", v, out string error))
                        MessageBox.Show(error);
                }
    
                onInited?.Invoke(br);
            };
    
            return result;
        }
    
        private class _requestHandler : DefaultRequestHandler
        {
            private NetworkCredential _credential;
    
            public _requestHandler(NetworkCredential credential = null) : base()
            {
                _credential = credential;
            }
    
            public override bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
            {
                if (isProxy == true)
                {
                    if (_credential == null)
                        throw new NullReferenceException("credential is null");
    
                    callback.Continue(_credential.UserName, _credential.Password);
                    return true;
                }
    
                return false;
            }
        }
    }
    

    Using:

            var p = new WebProxy("Scheme://Host:Port", true, new[] { "" }, new NetworkCredential("login", "pass"));
            var p1 = new WebProxy("Scheme://Host:Port", true, new[] { "" }, new NetworkCredential("login", "pass"));
            var p2 = new WebProxy("Scheme://Host:Port", true, new[] { "" }, new NetworkCredential("login", "pass"));
    
            wb1 = ChromeTest.Create(p1, b => b.Load("http://speed-tester.info/check_ip.php"));
            groupBox1.Controls.Add(wb1);
            wb1.Dock = DockStyle.Fill;
    
            wb2 = ChromeTest.Create(p2, b => b.Load("http://speed-tester.info/check_ip.php"));
            groupBox2.Controls.Add(wb2);
            wb2.Dock = DockStyle.Fill;
    
            wb3 = ChromeTest.Create(p, b => b.Load("http://speed-tester.info/check_ip.php"));
            groupBox3.Controls.Add(wb3);
            wb3.Dock = DockStyle.Fill;
    

提交回复
热议问题