Search code examples
c#cefsharpchromium-embeddedcefsharp.offscreen

In there a replacement for OnBeforeResourceLoad in IRequestHandler?


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.

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
  • OffScreen

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.


Solution

  • 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!

    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);
            }
        }
    

    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);
            }
        }
    

    When instantiating the ChromiumWebBrowser object, you set the RequestHandler to the RequestHandlerExt class above using:

    ChromiumWebBrowser browser = new ChromiumWebBrowser();
    browser.RequestHandler = new RequestHandlerExt(userAgent);
    
    • Specifying a user agent in CefSettings will get overwritten, so its not needed in this case.
    • If you do not specify a user agent, then no headers will be added/modified
    • The user agent can be changed for each browser.Load(url) call.