CefSharp 3在运行时设置代理

我下载了CEF(chromuim嵌入式框架)二进制分发(cefclient&cefsimple)c ++示例,并且实现了cefclient可以在运行时更改代理设置。

这样做的关键是获取RequestContext并调用函数SetPreference。

在CefClient上一切都很好。

但是在CefSharp上,调用SetPreference始终返回false,并且HasPreference对首选项名称“proxy”返回false。

感谢amaitland积极改变请求上下文优先级的正确方法,就是在CEF UIThread上运行代码如下:

  Cef.UIThreadTaskFactory.StartNew(delegate { var rc = this.browser.GetBrowser().GetHost().RequestContext; var v = new Dictionary(); v["mode"] = "fixed_servers"; v["server"] = "scheme://host:port"; string error; bool success = rc.SetPreference("proxy", v, out error); //success=true,error="" }); 

如果有人需要任何其他灵魂,我找到了这个解决方案。

 Cef.UIThreadTaskFactory.StartNew(delegate { string ip = "ip or adress"; string port = "port"; var rc = this.browser.GetBrowser().GetHost().RequestContext; var dict = new Dictionary(); dict.Add("mode", "fixed_servers"); dict.Add("server", "" + ip + ":" + port + ""); string error; bool success = rc.SetPreference("proxy", dict, out error); }); 

我下载了CefSharp.WinForms 65.0.0并制作了类,这有助于开始使用代理:

 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; } } } 

使用:

  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;