CefSharp: SchemeHandler не перехватывает запросы websocket (wss / ws) - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть приложение WPF, которое уже некоторое время использует CefSharp без проблем. Сейчас я пытаюсь подключить встроенный браузер к нашему решению BI, используя другой метод аутентификации. Этот метод требует от меня установки пользовательских заголовков в запросе. Когда приложение веб-клиента с BI-сервера загружается, соединение с веб-сокетом устанавливается обратно на сервер, поэтому мне нужно установить те же пользовательские заголовки для этого соединения. Как мне это сделать с CefSharp? Я попытался создать и зарегистрировать ISchemeHandlerFactory для схемы "wss", но он никогда не перехватывает запрос websocket, поэтому я не могу вставить дополнительные заголовки. Если я вернусь к старому методу аутентификации, то соединение с веб-сокетом будет установлено и будет работать, как и ожидалось. Любая помощь или предложения будут оценены. Вот соответствующие биты тестового кода, который я использовал:

WebSocketHandlerFactory.cs

using CefSharp;
using System;

namespace cefsharpTest
{
    public class WebSocketHandlerFactory : ISchemeHandlerFactory
    {
        public const string SchemeName = "wss";

        public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
        {
            Console.WriteLine("----------------->  Here inside WebsocketHandlerFactory  <----------------------");
            return new WebsocketResourceHandler();
         }
     }
}

WebSocketResourceHandler.cs (Ничего реализован, я просто надеялся увидеть исключение при вызове любого из методов)

using CefSharp;
using CefSharp.Callback;
using System;
using System.IO;

namespace cefsharpTest
{
    class WebsocketResourceHandler : IResourceHandler
    {
        public void Cancel()
        {
            throw new NotImplementedException();
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl)
        {
            throw new NotImplementedException();
        }

        public bool Open(IRequest request, out bool handleRequest, ICallback callback)
        {
            throw new NotImplementedException();
        }

        public bool ProcessRequest(IRequest request, ICallback callback)
        {
            throw new NotImplementedException();
        }

        public bool Read(Stream dataOut, out int bytesRead, IResourceReadCallback callback)
        {
            throw new NotImplementedException();
        }

        public bool ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
        {
            throw new NotImplementedException();
        }

        public bool Skip(long bytesToSkip, out long bytesSkipped, IResourceSkipCallback callback)
        {
            throw new NotImplementedException();
        }
    }
}

App.xaml.cs (тестовое приложение WPF с инициализацией CefSharp)

using CefSharp;
using System;
using System.Windows;
using System.Windows.Threading;

namespace cefsharpTest
{
    public partial class App : Application
    {
        public App()
        {
            InitializeCefSharp(this.Dispatcher);
        }

        private static void InitializeCefSharp(Dispatcher dispatcher)
        {
            Console.WriteLine("Initializing the CefSharp API...");

            var settings = new CefSharp.Wpf.CefSettings();
            settings.RegisterScheme(new CefCustomScheme { SchemeName = WebSocketHandlerFactory.SchemeName, SchemeHandlerFactory = new WebSocketHandlerFactory() });
            Cef.Initialize(settings);

            // Make sure CefSharp is shutdown when application closes
            dispatcher.ShutdownStarted += (sender, e) =>
            {
                Cef.Shutdown();
            };
        }
    }

}
...