CEFSharp实例级自定义User Agent的实现问题求助
给单个CEFSharp实例独立设置User Agent而非全局设置
刚接触CEFSharp项目,我需要将User Agent绑定到单个浏览器实例,而非进行全局设置。
目前我在Program.cs中使用以下代码做全局UA设置:
var settings = new CefSettings(); settings.CefCommandLineArgs.Add("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1");
这种方式虽能生效,但属于全局设置。我需要同时使用两个窗体,分别模拟移动端和桌面端浏览器,全局设置显然不适用,每次切换都要注释或取消注释该行代码,操作十分繁琐。
我尝试了以下代码来实现实例级UA设置:
using CefSharp; using CefSharp.Handler; public class CustomRequestHandler : CefSharp.Handler.RequestHandler { protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect) { // 仅拦截指定URL if (request.Url == "https://www.whatismybrowser.com/detect/what-is-my-user-agent") { request.SetHeaderByName("user-agent", "MyBrowser CefSharp Browser", true); } // 始终返回false以继续导航 return false; } }
我认为代码逻辑没问题,但遇到了IRequest为只读的问题,尝试多种改写方式后仍无法解决。
后续尝试(编辑补充)
我调整了思路,改用以下代码:
using CefSharp; using CefSharp.Handler; using System; using System.Collections.Specialized; public class CustomRequestHandler : RequestHandler { protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect) { if (request.Url == "https://www.whatismybrowser.com/detect/what-is-my-user-agent") { try { // 记录URL拦截日志 Console.WriteLine("Intercepted URL: " + request.Url); // 创建存储修改后请求头的集合 var modifiedHeaders = new NameValueCollection(request.Headers); // 修改User Agent modifiedHeaders["user-agent"] = "MyBrowser CefSharp Browser"; // 创建带有修改后请求头的新请求 var modifiedRequest = frame.CreateRequest(); modifiedRequest.Url = request.Url; modifiedRequest.Method = request.Method; modifiedRequest.Headers = modifiedHeaders; // 复制POST数据(如果存在) if (request.PostData != null) { modifiedRequest.PostData = request.PostData; } // 使用浏览器加载修改后的请求 frame.LoadRequest(modifiedRequest); // 记录修改后请求加载成功日志 Console.WriteLine("Modified request loaded successfully."); return true; // 取消原始请求 } catch (Exception ex) { // 记录异常信息用于调试 Console.WriteLine("Exception occurred: " + ex.Message); } } return false; // 继续使用原始请求 } }
使用这段代码后,测试URL无法加载,但其他URL可以正常访问。说明代码确实对测试URL进行了处理,但页面无法打开,且仅按预期拦截移动端浏览器的请求。
添加日志后得到以下内容:
OnBeforeBrowse URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent Intercepted URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent Modified request loaded successfully. Load Error: Aborted, ERR_ABORTED, https://www.whatismybrowser.com/detect/what-is-my-user-agent Loading State Changed: False [14956:7864:0710/043123.774:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213 GetResourceRequestHandler: https://csm.us5.us.criteo.net/iev?entry=c~Gum.ChromeSyncframe.CookieRead.uid~1&entry=c~Gum.ChromeSyncframe.FragmentData.onetag.Bundle.Origin.undefined~1&entry=c~Gum.ChromeSyncframe.SidReadSuccess~1&entry=h~Gum.ChromeSyncframe.SidReadSuccessDuration~328 Render process terminated: ProcessCrashed [8352:10124:0710/040922.537:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213 [8352:10124:0710/040922.538:VERBOSE1:browser_info_manager.cc(531)] frame 6-BB0DCBA5339448D1441249D75553904F, pdf_process=0, browser_process_guest=0, print_preview_dialog=0, main=1 [8352:10124:0710/040922.542:VERBOSE1:frame_host_impl.cc(515)] frame A-F5DF7D801E84FDC36BCC535A08C6FD9B (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1) [8352:10124:0710/040922.543:VERBOSE1:frame_host_impl.cc(515)] frame 9-870ABD8F28E33A0A82F7D99F90C14289 (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1) [18420:11048:0710/040922.543:VERBOSE1:network_delegate.cc(35)] NetworkDelegate::NotifyBeforeURLRequest: https://csm.us5.us.criteo.net/iev?entry=c~Gum.ChromeSyncframe.CookieRead.uid~1&entry=c~Gum.ChromeSyncframe.FragmentData.onetag.Bundle.Origin.undefined~1&entry=c~Gum.ChromeSyncframe.SidReadSuccess~1&entry=h~Gum.ChromeSyncframe.SidReadSuccessDuration~676 [8352:10124:0710/040922.544:VERBOSE1:frame_host_impl.cc(515)] frame 8-A5EA056889DFBED6602D2F909E9971D4 (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)
添加disable-site-isolation-trials命令行参数后,页面仍无法加载,浏览器陷入无限刷新循环。
内容的提问来源于stack exchange,提问作者Spontane
相关产品推荐
相关产品推荐

