Есть ли замена для OnBeforeResourceLoad в IRequestHandler? - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь динамически изменить пользовательский агент с помощью CefSharp. Я посмотрел на класс IRequestHandler и больше не вижу метод с именем OnBeforeResourceLoad.

Однако я нашел метод с именем OnBeforeBrowse. Однако все заголовки запроса пусты, и когда я пытаюсь добавить их, он просто не добавляется. Я пытался взять ссылку, изменить значение и переназначить, но без кубика.

CefSharp: 75.1.142 .NET: 4.7.2 OffScreen

Я нашел метод с именем OnBeforeBrowseв IRequestHandler. Однако все заголовки запроса пусты, и когда я пытаюсь добавить их с помощью параметра 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;
}

Я ожидаю, что пользовательский агент изменит значение, которое я ему задаю

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Я потратил много времени на это и не смог найти никаких примеров в свете этих новых изменений в библиотеке 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);
        }
    }

Определите класс, который реализует 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);
        }
    }

При создании экземпляра объекта ChromiumWebBrowser вы устанавливаете RequestHandler в класс RequestHandlerExt, описанный выше, используя:

ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.RequestHandler = new RequestHandlerExt(userAgent);
  • Указание пользовательского агента в CefSettings будет перезаписано, поэтому в этом случае его не нужно.
  • Если вы не укажете пользовательский агент, заголовки не будут добавлены / изменены
  • Пользовательский агент можно изменить для каждого браузера. Вызов загрузки (url).
0 голосов
/ 02 октября 2019

Начиная с версии 75 CEF теперь поддерживает сетевую службу Chromium, которая вносит огромное количество критических изменений API.

Согласно https://github.com/cefsharp/CefSharp/issues/2743

Обратные вызовы, связанные с ресурсами, были перемещеныс IRequestHandler на новый IResourceRequestHandler интерфейс, который возвращается методом IRequestHandler.GetResourceRequestHandler

  • Новый RequestHandler доступен для переопределения только тех методов, которые вам необходимы
  • Новый ResourceRequestHandler доступен для переопределения только тех методов, которые вам необходимы
...