2015-07-06 29 views
5

oppure Come iniettare un'intestazione personalizzata nella richiesta iniziale di un sito durante la creazione di un'istanza di ChromiumWebBrowser.chromium: invia informazioni di intestazione personalizzate sul caricamento iniziale della pagina C#

Sono un noob con Chromium e potrei davvero usare un po 'di aiuto. Ho una winforms app con una finestra CEF. K, nessun problema fino ad ora. Quello che devo fare è chiamare/caricare l'url iniziale con un http-header personalizzato che contenga informazioni di autenticazione. È possibile?

Il seguente è essenzialmente ciò che è in gioco e tutte le parti funzionano tranne l'intestazione personalizzata (Doh!)

Winform (CEF httpRequest (con intestazione personalizzata)) [non viene mai oltre questo punto] => C# MVC web app => Owin_Authentication_Pipeline segment => MVC Response con popolata Razor view => Mostra nell'app Winform Chromium.

Forse questo aiuterà così:

using CefSharp; 
using CefSharp.WinForms; 
... 
private void Form1_Load(object sender, EventArgs e) 
{ 
    Cef.Initialize(); 
    ChromiumWebBrowser myBrowser = new ChromiumWebBrowser("whatever.com"); 
    // ??How do i get a custom header be sent with the above line?? 

    myBrowser.Dock = DockStyle.Fill; 
    //myBrowser.ShowDevTools(); 
    //myBrowser.RequestHandler = new DSRequestHander(); 
    //myBrowser.FrameLoadStart += myBrowser_FrameLoadStart; 
    this.Controls.Add(myBrowser); 
} 

ho Groggled questo a morte, guardato, ha provato tutti i trucchi nella mia cassetta degli attrezzi e poi alcuni.

Qualsiasi idea, aiuto o suggerimenti su come potrei essere in grado di risolvere o aggirare questo boggler è molto apprezzata. Grazie in anticipo.

+1

Stai utilizzando il progetto CEFSharp? https://github.com/cefsharp/CefSharp/wiki – NinjaMid76

+0

@ NinjaMid76 Sì, sì lo sono. – JackJack

+0

È quasi impossibile aiutarti se non condividi più informazioni, ad es. su quanto in questa catena di componenti arriva l'intestazione personalizzata. Appare nel segmento Owin_Authentication_Pipeline? Lo rifiuta? Ecc. Ecc. Forniscici alcune informazioni di debug di base su ciò che hai provato. Buone domande StackOverflow hanno un [MVCE] (http://stackoverflow.com/help/mcve) – jornh

risposta

6

Implementare e assegnare IRequestHandler. Il metodo il vostro dopo dovrebbe essere OnBeforeResourceLoad, un esempio di base dovrebbe essere simile

bool IRequestHandler.OnBeforeResourceLoad(IWebBrowser browser, IRequest request, IResponse response) 
{ 
    var headers = request.Headers; 
    headers["Custom-Header"] = "My Custom Header"; 
    request.Headers = headers; 
    return false; 
} 

Così com'è è necessario leggere la proprietà intestazioni, apportare le modifiche quindi riassegnarlo.

+0

Ho creato una classe CustomChromeBrowser che eredita da ChromiumWebBrowser e assegna una classe RequestHandler (fornita con un progetto demo) tramite evento Initialized della classe CustomChromeBrowser. – CodingYourLife

+0

Tutti i 'Handler' sono semplici proprietà, assegnandoli nel costruttore sarebbe sufficiente. – amaitland

+0

Possiamo avere maggiori dettagli per favore, ho lo stesso problema e non sono sicuro di capire come fare ciò che suggerisci. – Psddp

3

È necessario creare una classe che implementa IRequestHandler quindi impostare un'istanza di tale classe come RequestHandler nell'oggetto browser.

Con la versione 53, che la classe dovrebbe essere simile:

class ChromeBrowserRequestHandler: 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) 
     { 
      return false; 
     } 

     public bool OnBeforePluginLoad(IWebBrowser browser, string url, string policyUrl, WebPluginInfo info) 
     { 
      return false; 
     } 

     public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) 
     { 
      var headers = request.Headers; 
      headers["Custom-Header"] = "My Custom Header"; 
      request.Headers = headers; 

      return CefReturnValue.Continue; 
     } 

     public bool OnCertificateError(IWebBrowser browser, CefErrorCode errorCode, string requestUrl) 
     { 
      return false; 
     } 

     public void OnPluginCrashed(IWebBrowser browser, string pluginPath) 
     { 
     } 

     public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status) 
     { 
     } 

     public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) 
     { 
      return null; 
     } 

     public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback) 
     { 
      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) 
     { 
      return false; 
     } 

     public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser) 
     { 
     } 

     public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength) 
     { 
     } 

     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; 
     } 
    } 

Poi, durante la creazione oggetto del browser:

ChromiumWebBrowser myBrowser = new ChromiumWebBrowser("whatever.com") 
{ 
    RequestHandler = new ChromeBrowserRequestHandler() 
}; 

Si noti che il gestore della richiesta deve essere impostata prima di caricare la pagina. Se non è possibile impostare il gestore richieste durante l'instanctiaction, è comunque possibile impostarlo in seguito a ricaricare la pagina con myBrowser.Load("whatever.com").