Не удается получить RequestHandler для работы с WinSform CefSharp C# - PullRequest
0 голосов
/ 23 марта 2020

Я немного новичок в c# и CefSharp :-) так что будьте спокойны со мной!

Моя цель - вызвать URL-адрес, а затем исследовать DOM, чтобы получить данные и затем обработать эти данные для гипервизора. Я добился этого извлечения, и мой js код хорошо работает с помощью EvaluateScriptAsyn c.

. Теперь я хочу отслеживать данные refre sh. Страница обновляется посредством связи через веб-сокет, которая затем обновляет значения в объектной модели DOM.

Я думаю использовать RequestHandler и адаптировать GetResourceResponseFilter; но мне не удается это сделать, и кажется, что методы, которые я реализовал, никогда не вызывались ... я использую минимальное решение, загруженное с сайта проекта cefsharp. Я просто добавляю две строки в конце этого фрагмента:

 public BrowserForm()
        {
            InitializeComponent();

            Text = "CefSharp";
            WindowState = FormWindowState.Maximized;

            browser = new ChromiumWebBrowser("www.google.com");
            toolStripContainer.ContentPanel.Controls.Add(browser);

            browser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged;
            browser.LoadingStateChanged += OnLoadingStateChanged;
            browser.ConsoleMessage += OnBrowserConsoleMessage;
            browser.StatusMessage += OnBrowserStatusMessage;
            browser.TitleChanged += OnBrowserTitleChanged;
            browser.AddressChanged += OnBrowserAddressChanged;
            // Add this  for request handler
            Handler.RequestHandler requestHandler = new MyBasicRequestHandler();
            browser.RequestHandler = requestHandler;

И мой тестовый обработчик выглядит так!

public class MyBasicRequestHandler : CefSharp.Handler.RequestHandler
        {
            public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
            {
                MessageBox.Show ("OnResourceResponse");
                return false;
            }
            public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
            {
                MessageBox.Show("OnProtocolExecution : "+url);
                return false;
            }
            public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
            {
                MessageBox.Show("GetResourceResponseFilter : " + request.ReferrerUrl);
                return null;
            }
        }

Но ничего не запускается!

Буду признателен за любую помощь или совет.

спасибо!

1 Ответ

0 голосов
/ 25 марта 2020

Благодаря любезным комментариям amaitland этот код работает. Я только добавил несколько строк в решение CefSharp.Minimal Example.Winforms, извлеченное из github для регистрации RequestHandler.

public BrowserForm()
        {
            InitializeComponent();

            Text = "CefSharp";
            WindowState = FormWindowState.Maximized;

            browser = new ChromiumWebBrowser("https://cefsharp.github.io/");
            toolStripContainer.ContentPanel.Controls.Add(browser);

            browser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged;
            browser.LoadingStateChanged += OnLoadingStateChanged;
            browser.ConsoleMessage += OnBrowserConsoleMessage;
            browser.StatusMessage += OnBrowserStatusMessage;
            browser.TitleChanged += OnBrowserTitleChanged;
            browser.AddressChanged += OnBrowserAddressChanged;
            // Add this  for request handler
            Handler.RequestHandler requestHandler = new MyBasicRequestHandler();
            browser.RequestHandler = requestHandler;

            var version = string.Format("Chromium: {0}, CEF: {1}, CefSharp: {2}",
               Cef.ChromiumVersion, Cef.CefVersion, Cef.CefSharpVersion);

            var bitness = Environment.Is64BitProcess ? "x64" : "x86";
            var environment = String.Format("Environment: {0}", bitness);

            DisplayOutput(string.Format("{0}, {1}", version, environment));
        }

А затем я добавил код для классов MyBasicRequestHandler и MyCustomResourceRequestHandler следующим образом:

public class MyCustomResourceRequestHandler : CefSharp.Handler.ResourceRequestHandler
        {
            private readonly System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();

            protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
            {
                return new CefSharp.ResponseFilter.StreamResponseFilter(memoryStream);
            }

            protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
            {
                //You can now get the data from the stream
                var bytes = memoryStream.ToArray();

                if (response.Charset == "utf-8")
                {
                    var str = System.Text.Encoding.UTF8.GetString(bytes);
                    Console.WriteLine("In OnResourceLoadComplete : " + str.Substring(0,10) + " <...>");
                }
                else
                {
                    //Deal with different encoding here
                }
            }
        }

        public class MyBasicRequestHandler : CefSharp.Handler.RequestHandler
        {
            protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
            {
                Console.WriteLine("In GetResourceRequestHandler : " + request.Url);
                //Only intercept specific Url's
                if (request.Url == "http://cefsharp.github.io/" || request.Url == "https://cefsharp.github.io/")
                {
                    return new MyCustomResourceRequestHandler();
                }
                //Default behaviour, url will be loaded normally.
                return null;
            }

        }

Запустите приложение и рады видеть это в выводе консоли VisualStudio:

In GetResourceRequestHandler : https://cefsharp.github.io/
In OnResourceLoadComplete : <!DOCTYPE  <...>
In GetResourceRequestHandler : https://fonts.googleapis.com/css?family=Ubuntu:400,500
In GetResourceRequestHandler : https://cefsharp.github.io/stylesheets/stylesheet.css
In GetResourceRequestHandler : https://cefsharp.github.io/stylesheets/github-light.css
In GetResourceRequestHandler : https://sidecar.gitter.im/dist/sidecar.v1.js
In GetResourceRequestHandler : https://cefsharp.github.io/images/logo2.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram1.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram2.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram3.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram4.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram5.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram7.png
In GetResourceRequestHandler : https://cefsharp.github.io/images/diagram6.png
In GetResourceRequestHandler : https://cefsharp.github.io/stylesheets/print.css
In GetResourceRequestHandler : https://cefsharp.github.io/images/top-header.png
In GetResourceRequestHandler : https://fonts.gstatic.com/s/ubuntu/v14/4iCs6KVjbNBYlgoKfw72.woff2
In GetResourceRequestHandler : https://fonts.gstatic.com/s/ubuntu/v14/4iCv6KVjbNBYlgoCjC3jsGyN.woff2

Итак, моя проблема решена! Еще раз спасибо, дорогая Amaitland; -)

...