在IRequestHandler中有OnBeforeResourceLoad的替代品吗? [英] In there a replacement for OnBeforeResourceLoad in IRequestHandler?
问题描述
我正在尝试使用CefSharp动态更改用户代理.我查看了IRequestHandler类,再也看不到名为OnBeforeResourceLoad的方法.
I'm trying to change the user agent dynamically using CefSharp. I have looked at the IRequestHandler class and I no longer see a method called OnBeforeResourceLoad.
但是,我确实找到了一个名为OnBeforeBrowse的方法.但是,所有请求标头都是空的,当我尝试添加一个标头时,它根本没有添加.我试图做个参考,更改值并重新分配,但没有骰子.
I did, however, find a method called OnBeforeBrowse. However, all of the request headers are empty and when I try and add one, it simply does not add. I have tried to take a reference, change the value and re-assign, but no dice.
- CefSharp:75.1.142
- .NET:4.7.2
- 屏幕外
我在IRequestHandler中找到了一个名为OnBeforeBrowse的方法.但是,所有请求标头都是空的,当我尝试通过IRequest参数添加一个标头时,它根本没有添加.我尝试参考,更改值并重新分配,但没有骰子.总是空着没有钥匙.
I found a method called OnBeforeBrowse in IRequestHandler. However, all of the request headers are empty and when I try and add one via the IRequest param, it simply does not add. I have tried to take a reference, change the value and re-assign, but no dice. Always comes back empty with no keys.
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;
}
我希望用户代理更改为我提供的值.
I expect the user agent to change to the value I give it.
推荐答案
我已经花了很多时间,鉴于对CefSharp库的这些新更改,我找不到任何示例,因此我将它们放在一起有用的东西.我用在网上找到的点点滴滴,将它们放在一起.它可能并不完美,但是我在任何地方都找不到简单的答案!
I have spent a lot of time on this and I couldn't find any examples in light of these new changes to the CefSharp library, so I have put together something that works. I used bits and pieces I found online and put it all together. It may not be perfect, but I couldnt find a straight forward answer anywhere!
定义实现ResourceRequestHandler的类.基类具有必需的OnBeforeResourceLoad函数.我在构造函数中添加了一个userAgent字符串,可以通过调用fucntions传递该字符串.
Define the class which implements ResourceRequestHandler. The base class has the required OnBeforeResourceLoad function. I added a userAgent string to the constructor see it can be passed from calling fucntions.
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类.
Define the class which implements RequestHandler. The base class has a required GetResourceRequestHandler function which allows use to pass our user agent to the 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对象时,可使用以下命令将RequestHandler设置为上面的RequestHandlerExt类:
When instantiating the ChromiumWebBrowser object, you set the RequestHandler to the RequestHandlerExt class above using:
ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.RequestHandler = new RequestHandlerExt(userAgent);
- 在CefSettings中指定用户代理将被覆盖,因此在这种情况下不需要.
- 如果您未指定用户代理,则不会添加/修改标头
- 可以为每个浏览器更改用户代理.调用load(url).
这篇关于在IRequestHandler中有OnBeforeResourceLoad的替代品吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!