2017-02-28 70 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