У меня есть приложение 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();
};
}
}
}