我在这方面花了很多时间,但鉴于 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) 调用更改用户代理。