Я использую CEFSharp для создания очень простого браузера в C# с использованием WinForms. Единственная функциональность, которая мне нужна, - это мгновенная очистка всех файлов cookie и установка пользовательской строки пользовательского агента.
Это прекрасно работало до недавнего обновления до версии 79 с более старой версии CEFSharp. Из-за устаревания некоторых функций мне пришлось реализовать несколько новых интерфейсов, таких как, например, ICookieAccessFilter
(см. Полный список ниже).
После того, как мой браузер перестал показывать новый контент. При вызове метода Load(url)
я вижу следующие методы из моей реализации интерфейса (в этом порядке):
OnBeforeBrowse
GetResourceRequestHandler
GetCookieAccessFilter
OnBeforeResourceLoad
GetResourceHandler
OnResourceResponse
GetResourceResponseFilter
Тем не менее, в браузере ничего не отображается. Если я щелкну правой кнопкой мыши в окне браузера и выберу «Просмотр источника», я получу источник по умолчанию для пустой страницы, чтобы увидеть:
<html><head></head><body></body></html>
В отладке я вижу, что свойство Address браузера было изменено, но все равно содержимое не отображается (просто пустой экран)
Я считаю, что что-то может быть не так с реализациями моего "бедного человека", но Я уже несколько раз проверял их на примере приложений в репозитории CEFSharp GitHub, и не вижу в этом ничего плохого.
Вот полный исходный код этого интерфейса.
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using CefSharp;
using CefSharp.Callback;
namespace CustomWebBrowser
{
public class CustomRequestHandler : IRequestHandler
{
public string UserAgent { get; set; }
public string CookiePath { get; set; }
public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
return false;
}
bool IRequestHandler.OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return this.OnOpenUrlFromTab(browserControl, browser, frame, targetUrl, targetDisposition, userGesture);
}
public IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
return new CustomResourceRequestHandler(this);
}
public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host,
int port, string realm, string scheme, IAuthCallback callback)
{
callback.Dispose();
return false;
}
bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
return false;
}
void IRequestHandler.OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
{
}
void IRequestHandler.OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
{
}
bool IRequestHandler.OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
return false;
}
void IRequestHandler.OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
{
}
protected virtual bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}
public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
return true;
}
public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
{
}
public bool CanGetCookies(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
return true;
}
public bool CanSetCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, Cookie cookie)
{
return true;
}
}
public class CustomResourceRequestHandler : IResourceRequestHandler
{
public CustomRequestHandler Handler { get; }
public ICookieAccessFilter GetCookieAccessFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
IRequest request)
{
return new CustomCookieAccessFilter();
}
public CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
IRequestCallback callback)
{
var headers = request.Headers;
var userAgent = headers["User-Agent"];
headers["User-Agent"] = Handler.UserAgent;
request.Headers = headers;
return CefReturnValue.Continue;
}
public IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
return new CustomResourceHandler();
}
public void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
IResponse response, ref string newUrl)
{
}
public bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
IResponse response)
{
return false;
}
public IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
IRequest request, IResponse response)
{
return null;
}
public void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request,
IResponse response, UrlRequestStatus status, long receivedContentLength)
{
}
public bool OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
return true;
}
public CustomResourceRequestHandler(CustomRequestHandler handler)
{
Handler = handler;
}
}
public class CustomResourceHandler : ResourceHandler
{
public bool ProcessRequest(IRequest request, ICallback callback)
{
return true;
}
}
public class CustomCookieAccessFilter : ICookieAccessFilter
{
public bool CanSendCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, Cookie cookie)
{
return true;
}
public bool CanSaveCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response,
Cookie cookie)
{
return true;
}
}
}