Gin*_*nko 1 c# chromium-embedded cefsharp cefsharp.offscreen
我正在尝试使用 CefSharp 动态更改用户代理。我查看了 IRequestHandler 类,但不再看到名为 OnBeforeResourceLoad 的方法。
但是,我确实找到了一个名为 OnBeforeBrowse 的方法。但是,所有请求标头都是空的,当我尝试添加一个时,它根本没有添加。我试图参考,更改值并重新分配,但没有骰子。
我在 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)
我希望用户代理更改为我给它的值。
我在这方面花了很多时间,但根据 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)