1

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

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

  • 头孢夏普: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;
}

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

4

2 回答 2

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);
        }
    }

定义实现 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);
        }
    }

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

ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.RequestHandler = new RequestHandlerExt(userAgent);
  • 在 CefSettings 中指定用户代理将被覆盖,因此在这种情况下不需要它。
  • 如果您不指定用户代理,则不会添加/修改任何标题
  • 可以为每个 browser.Load(url) 调用更改用户代理。
于 2019-10-02T09:44:55.173 回答
2

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

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

与资源相关的回调已从通过方法返回IRequestHandler的新接口移动IResourceRequestHandlerIRequestHandler.GetResourceRequestHandler

于 2019-10-02T09:33:26.953 回答