我看到similar questions发布了,没有答案.我是使用CefSharp的新手,但我需要知道是否可以获取网页加载的所有资源,例如图像,字体等.
官方文档对于如何实现这一目标似乎有些晦涩.
更清楚地说,场景非常简单.当您使用CefSharp加载网页时,该网页包含图像,JavaScript文件,字体文件等资源.我只需要获取所有这些资源即可进行探索.
在此先感谢您的帮助,对不起我的英语.
解决方法:
您不清楚要使用资源做什么.
您是否只需要资源清单?还是您想要资源的内容?
无论哪种方式,实现IRequestHandler都是要走的路.
_myChromiumBrowser = new CefSharp.WinForms.ChromiumWebBrowser("http://somedomain.com")
{
RequestHandler = new MyRequestHandler()
};
public class MyRequestHandler : IRequestHandler
{
public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
return false;
}
public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
{
// You can check the Request object for the URL Here
return false;
}
public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
// You can also check the URL here
callback.Dispose();
return CefReturnValue.Continue;
}
public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
callback.Dispose();
return false;
}
public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}
public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
{
}
public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
{
return false;
}
public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
callback.Dispose();
return false;
}
public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
{
}
public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
{
}
public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
// You can also check the request URL here
}
public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl)
{
}
public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return false;
}
public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return null;
}
public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
{
}
public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, System.Security.Cryptography.X509Certificates.X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
callback.Dispose();
return false;
}
…实际上,以上具有IRequest参数的任何函数都可用于检查URL. (以上内容基于CEFSharp的55版,因此您将需要根据要实现的版本来实现处理程序).上面也是一个空白模板,可以在您的项目中直接使用它,而CEFSharp / Chromium Web浏览器将返回适当的内容.
显然,您可以在CEFSharp源代码中找到一些源代码以获取适当的内容,但我并没有对其进行深入研究(因为我不需要达到目的).如果获取的是您想要的内容,则可能会发现,通过引发适当的HttpRequests并使用标准方法读取响应,可以更轻松地自己获取内容.
https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse(v=vs.110).aspx