You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:29:59