2016-05-10 19 views
1

Ich bin wirklich neu in CefSharps Chromium Browser und habe Schwierigkeiten herauszufinden, wie man das Ergebnis einer jquery ajax Anfrage erhält.CefSharp - Ergebnis der AJAX Anfrage erhalten

Mein erster Versuch war, meine AJAX Anfrage an EvaluateScriptAsync zu übergeben. Tatsächlich funktioniert das Skript. Es macht genau das, was ich will, aber ich bekomme keine Ergebnisse/Statuscodes, weil meine Cef-Task nicht wartet, bis AJAX seine Arbeit beendet hat.

Hier ein Beispiel (nur ein Beispielcode):

var tasks = pdBrowser.EvaluateScriptAsync(@" 
    (function(){ 
     $.ajax({ 
      type: ""POST"", 
      dataType: ""json"", 
      cache: false, 
      url: ""_resources/php/ajaxRequests.php"", 
      async: false, 
      data: { 
       action: ""insertCrossPlatform"", 
       type: """", 
       values: JSON.stringify(""foo bar"") 
      }, 
      success: function(response) { 
       if (typeof response === 'string' && response.substring(0, 5) == ""ERROR"") 
       { 
        return response; 
       } 
        else 
       { 
        //pageReload(); 
        return ""OK""; 
       } 
      }, 
      error: function(xhr, textStatus, errorThrown) { 
       return errorThrown + ""\n"" + xhr.responseText; 
      }, 
      complete: function() { 
       return ""COMPLETE""; 
      } 
     }); 
    })();", null); 

tasks.ContinueWith(t => 
{ 
    if (!t.IsFaulted) 
    { 
     var response = t.Result; 
     if (response.Success) 
     { 
      if (response.Result != null) 
      { 
       MessageBox.Show(response.Result.ToString()); 
      } 
     } 
     else 
     { 
      MessageBox.Show(response.Message, "Ein Fehler ist aufgetreten", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
    } 
}, TaskScheduler.Default); 

Danach habe ich gelesen, dass es ein SchemeHandler ist, aber ich verstehe nicht richtig, wie es zu implementieren. Kann mir jemand helfen?

Vielen Dank im Voraus.

+0

Wenn Sie in Ihrem anonymen Abschluss einen Wert zurückgegeben haben, wird dieser als Ergebnis von "EvaluateScriptAsync" zurückgegeben. Sie könnten die Parameter als json zurückgeben und dann eine 'WebRequest' in' C# 'ausführen, wenn Sie fertig sind, führen Sie' JS' aus, um Ihre 'UI' zu aktualisieren. Ich empfehle diesen Ansatz nicht besonders, siehe unten. – amaitland

Antwort

1

Erstens ist SchemeHandler wahrscheinlich nicht geeignet in diesem Szenario, würden Sie in der Regel eine SchemeHandler implementieren, wenn Sie die Antwort bereitstellen.

Die meisten Menschen wählen ein Objekt zu binden und rufen eine Methode für ihr gebundenes Objekt auf, wenn sie mit der übergeordneten Anwendung kommunizieren möchten. Ein Beispiel finden Sie in der FAQ. https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#3-how-do-you-expose-a-net-class-to-javascript

Mit 49.0.0 Sie ResponseFilter implementieren können den Zugriff auf die zugrunde liegende Antwortpuffer zu gewinnen, es ist komplex und nicht gut dokumentiert, so dass, wenn Ihr nicht bequem durch C++ Referenz-Code graben dann ist diese Option nicht für Sie. Hier ist eine Referenz https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Example/Filters/PassThruResponseFilter.cs#L17

+0

Der Link zum Wiki ist sehr hilfreich. Ich dachte nicht daran, ein Objekt zu binden ... das könnte wirklich eine gute Lösung für mich sein. Ich werde es heute Abend so schnell wie möglich testen. In der Tat, nein, ich bin nicht wirklich mit C++ vertraut. Ich kenne einige grundlegende C++, aber ich denke, es ist nicht so tief genug, um zu verstehen, wie man diese Methode verwendet. Ich werde es versuchen, sobald ich eine freie Minute habe, aber in der Zwischenzeit bin ich mir ziemlich sicher, die erste Lösung zu wählen und dieses Objekt zu binden. –

-1

Etwas, was ich getan habe, war ein Element auf der Seite durch Javascript mit einer ID, die die Antwort des Ajax Anruf ist. Wenn Sie beispielsweise einen Ajax-Anruf tätigen, weisen Sie dem Ajax-Anruf eine ID zu.

Wenn der AJAX-Aufruf zurückkehrt, schreiben Sie ein Element auf der Seite mit der zuvor zugewiesenen ID und den Rückrufinformationen. Dann können Sie einfach cefsharp verwenden, um den Inhalt des Elements von der Seite zu lesen, und dies werden Ihre Rückrufinformationen sein.

var myDivElement =document.getElementById('textareaInfo'); 

if(myDivElement === null) 
{ 
var input = document.createElement('textarea'); 
input.id = "textareaInfo"; 
input.value = "Test" 
input.rows="4"; 
input.cols="50"; 
input.style="height:100%;width:900px;" 

var dom = document.getElementsByClassName("page-body")[0]; 
dom.insertAdjacentElement('afterbegin', input) 
} 

Dann später mit ajax

var root = 'https://jsonplaceholder.typicode.com'; 

var _holder = callbackObj; 

callbackObj.showMessage(""ajax""); 

$.ajax({ 

    url: root + '/posts/1', 
contentType: 'application/json; charset=utf-8', 
    method: 'GET', 
complete: function(data){ 

}, 
success: function(response) { 

    $(#'textareaInfo').value(response);     
         } 
}).then(function(data) { 
    callbackObj.showMessage(data); 
}); 

dann die texarea von cefsharp in C# lesen

chromeBrowser.GetMainFrame(). EvaluateScriptAsync (function(). .. $ (textareaInfo) .value) .Ergebnis