2017-02-28 64 views
2

我看到similar questions已发布,但没有答案。我是新的使用CefSharp,但我需要知道,如果我可以得到所有资源加载的网页,例如图像,字体等。如何使用CefSharp获取网页加载的资源

官方文件似乎有点不明白如何实现这一点。

要更清楚一点,场景很简单。当您使用CefSharp加载网页时,此网页包含图像,JavaScript文件,字体文件等资源。我只需要抓住所有这些资源来探索它们。

在此先感谢您的帮助,并对我的英语感到抱歉。

+0

为了更清楚一点,我想要的资源列表不是他们的数据。 – Zeokat

回答

-1

你可以用jquery做,通过$(“img”)类型加载元素。每个(函数(){//做某事});

+0

但无限滚动的网页可能是一个问题。我认为CefSharp提供'CefSharp.IRequestHandler'来达到我需要的,但我不确定。不管怎么说,还是要谢谢你。 – Zeokat

5

你不完全清楚你想用资源做什么。

你想要的资源列表?或者你想要资源的内容?

无论采用哪种方式,实施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

+0

是的,我的错误。我需要一个资源列表(资源URL)而不是资源数据。 现在我的问题是如何在文本框中显示我可以进入OnBeforeResourceLoad的URL。可悲的是,我没有经历过C#的经验。 无论如何感谢您的解决方案,这是正确的方法。 – Zeokat

+1

在我需要交互的地方,用一个拥有窗体,我创建一个公共委托并在创建处理程序时分配它。 – VorTechS

+0

感谢VorTechS,我自己尝试了一些关于代表和活动的文章,但很遗憾无法达成解决方案。我一直在努力。 – Zeokat