在 IRequestHandler 中有 OnBeforeResourceLoad 的替代品吗?
In there a replacement for OnBeforeResourceLoad in IRequestHandler?
我正在尝试使用 CefSharp 动态更改用户代理。我查看了 IRequestHandler class,但我不再看到名为 OnBeforeResourceLoad 的方法。
不过,我确实找到了一个名为 OnBeforeBrowse 的方法。但是,所有请求 headers 都是空的,当我尝试添加一个时,它根本就没有添加。我试过参考,改值,re-assign,没骰子
- CefSharp:75.1.142
- .NET: 4.7.2
- 离屏
我在 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
方法返回
- 新 RequestHandler 可用于仅覆盖您需要的方法
- 新 ResourceRequestHandler 可用于仅覆盖您需要的方法
我在这上面花了很多时间,但鉴于 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) 调用都可以更改用户代理。
我正在尝试使用 CefSharp 动态更改用户代理。我查看了 IRequestHandler class,但我不再看到名为 OnBeforeResourceLoad 的方法。
不过,我确实找到了一个名为 OnBeforeBrowse 的方法。但是,所有请求 headers 都是空的,当我尝试添加一个时,它根本就没有添加。我试过参考,改值,re-assign,没骰子
- CefSharp:75.1.142
- .NET: 4.7.2
- 离屏
我在 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
方法返回
- 新 RequestHandler 可用于仅覆盖您需要的方法
- 新 ResourceRequestHandler 可用于仅覆盖您需要的方法
我在这上面花了很多时间,但鉴于 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) 调用都可以更改用户代理。