У меня есть элемент управления (ECBControl), содержащий ChromiumWebBrowser
<cefSharp:ChromiumWebBrowser x:Name="_browser" Grid.Column="0" Grid.ColumnSpan="2" AllowDrop="True"
Address="{Binding ElementName=_this, Path=Address, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
FrameLoadStart="_browser_FrameLoadStart" FrameLoadEnd="_browser_FrameLoadEnd"
MouseWheel="_browser_MouseWheel"
RenderOptions.BitmapScalingMode="{Binding ElementName=_this, Path=BitmapScaling, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" PreviewKeyDown="_browser_OnPreviewKeyDown"></cefSharp:ChromiumWebBrowser>
Диалог (ECBBrowser), содержащий ECBControl, регистрирует обработчик карты
private void ECBMapDialog_Loaded(object sender, RoutedEventArgs e)
{
this.ECBBrowser.Browser.RequestHandler = new ECBMapHandler(this);
}
Через некоторые Javascript взаимодействия (это было рассмотрено в другом SO-вопросе CefSharp Javascript регистрация и выполнение не работают в версии 79.1.36 ), веб-сайт вызывается несколько раз для получения изображений карты
Здесь я ожидал, что GetAuthCredentials моего ECBMapHandler будет вызван
public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
try
{
if (isProxy && ECBConfiguration.Instance.ProxyAuthentication)
{
var userName = Core.Applications.CoreApplication.ClientCredentials.GetUserName();
var password = Core.Applications.CoreApplication.ClientCredentials.GetPassword();
callback.Continue(userName, password);
return true;
}
if (this.Provider.Credentials.TryGetValue(host, out var credentials))
{
callback.Continue(credentials.GetUserName(), credentials.GetPassword());
return true;
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
callback.Cancel();
return false;
}
Но он никогда не вызывается, и в результате карта не отображается в браузере. Что мне нужно сделать, чтобы это работало?
Обновление
Я создал пример на основе решения MinimalExample. Вы можете найти его по телефону https://github.com/tbremeyer/CefSharpSample.git. Все действия для этого примера находятся в Main Windows .xaml.cs:
private async Task CallWebSite()
{
if (_callsPerformed > _maxCalls) return;
var executingAssembly = Assembly.GetExecutingAssembly();
var resourcePath = "CefSharp.MinimalExample.Wpf" + ".web.index.html";
if (executingAssembly.GetManifestResourceInfo(resourcePath) != null)
{
var resourceStream = executingAssembly.GetManifestResourceStream(resourcePath);
var memoryStream = new MemoryStream();
await resourceStream.CopyToAsync(memoryStream);
resourceStream.Close();
memoryStream.Position = 0;
var fileText = await new StreamReader(memoryStream).ReadToEndAsync();
Browser.LoadHtml(fileText, true);
}
var result = await Browser.EvaluateScriptAsync($"httpGet('http://httpbin.org/basic-auth/undefined/undefined?accept=json')");
_callsPerformed++;
}
Файл html загружается из файла ресурсов и загружается в браузер. html содержит сценарий, который выполняет запрос на получение URL-адреса, переданного в качестве параметра. URL-адрес требует аутентификации, вы получаете 401 (как видно в Fiddler). Метод GetAuthCredentials в MinimalExampleHandler никогда не вызывается.