在IRequestHandler中有OnBeforeResourceLoad的替代品吗? [英] In there a replacement for OnBeforeResourceLoad in IRequestHandler?

查看:289
本文介绍了在IRequestHandler中有OnBeforeResourceLoad的替代品吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆