在 IRequestHandler 中有 OnBeforeResourceLoad 的替代品吗?

Gin*_*nko 1 c# chromium-embedded cefsharp cefsharp.offscreen

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

但是,我确实找到了一个名为 OnBeforeBrowse 的方法。但是,所有请求标头都是空的,当我尝试添加一个时,它根本没有添加。我试图参考,更改值并重新分配,但没有骰子。

  • CefSharp:75.1.142
  • .NET:4.7.2
  • 离屏

我在 IRequestHandler 中找到了一个叫做 OnBeforeBrowse 的方法。但是,所有请求标头都是空的,当我尝试通过 IRequest 参数添加一个时,它根本没有添加。我试图参考,更改值并重新分配,但没有骰子。总是空着没有钥匙回来。

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Gin*_*nko 5

我在这方面花了很多时间,但根据 CefSharp 库的这些新更改,我找不到任何示例,因此我整理了一些有用的东西。我使用了我在网上找到的零碎碎片并将它们放在一起。它可能并不完美,但我在任何地方都找不到直接的答案!

定义实现ResourceRequestHandler 的类。基类具有所需的 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在实例化 ChromiumWebBrowser 对象时,您可以使用以下方法将 RequestHandler 设置为上面的 RequestHandlerExt 类:

ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.RequestHandler = new RequestHandlerExt(userAgent);
Run Code Online (Sandbox Code Playgroud)
  • 在 CefSettings 中指定用户代理将被覆盖,因此在这种情况下不需要。
  • 如果您不指定用户代理,则不会添加/修改标题
  • 可以为每个 browser.Load(url) 调用更改用户代理。