在 IRequestHandler 中有 OnBeforeResourceLoad 的替代品吗?

In there a replacement for OnBeforeResourceLoad in IRequestHandler?

我正在尝试使用 CefSharp 动态更改用户代理。我查看了 IRequestHandler class,但我不再看到名为 OnBeforeResourceLoad 的方法。

不过,我确实找到了一个名为 OnBeforeBrowse 的方法。但是,所有请求 headers 都是空的,当我尝试添加一个时,它根本就没有添加。我试过参考,改值,re-assign,没骰子

我在 IRequestHandler 中找到了一个名为 OnBeforeBrowse 的方法。但是,所有请求 headers 都是空的,当我尝试通过 IRequest 参数添加一个时,它根本不会添加。我试过引用,改变值和re-assign,但没有骰子。总是空着回来,没有钥匙。

protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
    var headers = request.Headers;
    headers["User-Agent"] = "New user agent";
    request.Headers = headers;
    return false;
}

我希望用户代理更改为我给它的值。

从版本 75 开始,CEF 现在支持 Chromium 网络服务,它带来了大量重大 API 更改。

根据https://github.com/cefsharp/CefSharp/issues/2743

与资源相关的回调已从 IRequestHandler 移至新的 IResourceRequestHandler 接口,该接口通过 IRequestHandler.GetResourceRequestHandler 方法返回

我在这上面花了很多时间,但鉴于 CefSharp 库的这些新变化,我找不到任何示例,所以我整理了一些有用的东西。我使用了我在网上找到的点点滴滴并将它们放在一起。它可能并不完美,但我无法在任何地方找到直接的答案!

定义实现 ResourceRequestHandler 的 class。基础 class 具有所需的 OnBeforeResourceLoad 函数。我向构造函数添加了一个 userAgent 字符串,看到它可以从调用函数传递。

    public class ResourceRequestHandlerExt : ResourceRequestHandler
    {
        private string userAgent;

        public ResourceRequestHandlerExt(string userAgent)
        {
            this.userAgent = userAgent;
        }

        protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
        {
            var headers = request.Headers;
            headers["User-Agent"] = userAgent;
            request.Headers = headers;

            return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
        }
    }

定义实现 RequestHandler 的 class。基础 class 有一个必需的 GetResourceRequestHandler 函数,它允许我们将用户代理传递给 ResourceRequestHandlerExt class.

    public class RequestHandlerExt : RequestHandler
    {
        private string userAgent;

        public RequestHandlerExt(string userAgent)
        {
            this.userAgent = userAgent;
        }

        protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
        {
            if (!string.IsNullOrEmpty(userAgent)) return new ResourceRequestHandlerExt(userAgent);
            else return base.GetResourceRequestHandler(chromiumWebBrowser, browser, frame, request, isNavigation, isDownload, requestInitiator, ref disableDefaultHandling);
        }
    }

在实例化 ChromiumWebBrowser object 时,您将 RequestHandler 设置为上面的 RequestHandlerExt class 使用:

ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.RequestHandler = new RequestHandlerExt(userAgent);
  • 在 CefSettings 中指定用户代理将被覆盖,因此在这种情况下不需要。
  • 如果不指定用户代理,则没有headers会是added/modified
  • 每次 browser.Load(url) 调用都可以更改用户代理。