如何在WinForms中使用CefSharp完成带身份验证的代理授权配置?
CefSharp.WinForms代理配置及授权方案
方案1:全局固定代理配置(适合应用启动后代理不变的场景)
该方案要求配置操作必须在ChromiumWebBrowser实例第一次创建之前完成,修改的是整个Cef运行环境的全局代理规则。
// 建议在Program.Main或者窗体的Load事件最开头执行初始化 if (!Cef.IsInitialized) { var settings = new CefSettings(); // 配置代理地址,格式支持http/https/socks5,示例:socks5://127.0.0.1:1080 settings.CefCommandLineArgs.Add("proxy-server", "你的代理IP:端口"); // 可选配置:不走代理的域名列表,<local>代表本地地址 settings.CefCommandLineArgs.Add("proxy-bypass-list", "<local>,*.不需要走代理的域名.com"); Cef.Initialize(settings); }
如果你的代理需要用户名密码授权,需要自定义请求处理器实现认证逻辑:
public class ProxyAuthRequestHandler : RequestHandler { private readonly string _userName; private readonly string _password; public ProxyAuthRequestHandler(string userName, string password) { _userName = userName; _password = password; } protected override bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback) { // 仅处理代理的认证请求 if (isProxy) { callback.Continue(_userName, _password); return true; } return base.GetAuthCredentials(chromiumWebBrowser, browser, originUrl, isProxy, host, port, realm, scheme, callback); } }
将处理器绑定到你的浏览器实例即可,你的原有代码修改后如下:
tabControl1.TabPages.Add("load"); chromeBrowser = new ChromiumWebBrowser("https://www.google.com/"); // 新增这行绑定代理认证逻辑,替换为你自己的代理账号密码 chromeBrowser.RequestHandler = new ProxyAuthRequestHandler("代理用户名", "代理密码"); tabControl1.TabPages[tabControl1.TabPages.Count -1].Controls.Add(chromeBrowser); tabControl1.ItemSize = new Size(200, 30); tabControl1.SelectedTab = tabControl1.TabPages[tabControl1.TabPages.Count - 1]; tabControl1.MouseClick += ShowContextMenuTabs; activeCurrentBrowser = chromeBrowser; chromeBrowser.AddressChanged += ChromeBrowser_AddressChanged; chromeBrowser.LoadingStateChanged += ChromeBrowser_LoadingStateChanged;
方案2:动态代理配置(适合运行时需要切换代理、不同浏览器实例用不同代理的场景)
该方案不需要修改全局Cef配置,通过独立的RequestContext给单个浏览器实例设置专属代理:
// 创建独立的请求上下文 var contextSettings = new RequestContextSettings { CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharpCustomCache") }; var customContext = new RequestContext(contextSettings); // 异步设置代理,协议可选http/socks5 await customContext.SetProxyAsync("http", "代理IP", 代理端口); // 创建浏览器时传入自定义请求上下文 chromeBrowser = new ChromiumWebBrowser("https://www.google.com/", customContext); // 同样绑定上面的ProxyAuthRequestHandler处理代理认证 chromeBrowser.RequestHandler = new ProxyAuthRequestHandler("代理用户名", "代理密码");
注意事项
- 所有Cef初始化、浏览器实例创建操作必须在UI线程执行
- 若使用socks5代理,代理地址前缀改为
socks5://即可 Cef.Initialize全局仅能调用一次,重复调用会触发异常
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

