CefSharp - 获取 AJAX 请求的结果
CefSharp - Get result of AJAX request
我是 CefSharps Chromium 浏览器的新手,很难搞清楚如何获得 jquery ajax 请求的结果。
我的第一次尝试是将我的 AJAX 请求传递给 EvaluateScriptAsync
。事实上,脚本有效。它完全符合我的要求,但我没有得到任何 results/status 代码,因为我的 Cef-Task 不会等到 AJAX 完成它的工作。
这里有一个例子(只是一个示例代码):
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);
后来看到有SchemeHandler,但是不太明白怎么实现。谁能帮帮我?
提前致谢。
首先,SchemeHandler
不太可能适用于这种情况,您通常会在提供响应时实施 SchemeHandler
。
大多数人选择绑定对象,并在希望与父应用程序通信时调用绑定对象上的方法。有关示例,请参见 FAQ
。 https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#3-how-do-you-expose-a-net-class-to-javascript
使用 49.0.0
你可以实现 ResponseFilter
来访问底层响应缓冲区,它很复杂而且没有很好的记录,所以如果你不喜欢挖掘参考 C++
代码然后这个选项不适合你。这是一个参考 https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Example/Filters/PassThruResponseFilter.cs#L17
我所做的是通过 javascript 在页面上创建一个元素,其 ID 是 ajax 调用的响应。因此,例如,当您进行 ajax 调用时,为 ajax 调用分配一个 ID。
当ajax调用returns时,在页面上写入一个元素,其中包含预先分配的id和回调信息。然后你就可以用cefsharp从页面中读取元素内容,这将是你的回调信息。
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)
}
Then later with 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);
});
Then read the texarea from cefsharp in c#
chromeBrowser.GetMainFrame().EvaluateScriptAsync(函数()...$(textareaInfo).value).Result
我是 CefSharps Chromium 浏览器的新手,很难搞清楚如何获得 jquery ajax 请求的结果。
我的第一次尝试是将我的 AJAX 请求传递给 EvaluateScriptAsync
。事实上,脚本有效。它完全符合我的要求,但我没有得到任何 results/status 代码,因为我的 Cef-Task 不会等到 AJAX 完成它的工作。
这里有一个例子(只是一个示例代码):
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);
后来看到有SchemeHandler,但是不太明白怎么实现。谁能帮帮我?
提前致谢。
首先,SchemeHandler
不太可能适用于这种情况,您通常会在提供响应时实施 SchemeHandler
。
大多数人选择绑定对象,并在希望与父应用程序通信时调用绑定对象上的方法。有关示例,请参见 FAQ
。 https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#3-how-do-you-expose-a-net-class-to-javascript
使用 49.0.0
你可以实现 ResponseFilter
来访问底层响应缓冲区,它很复杂而且没有很好的记录,所以如果你不喜欢挖掘参考 C++
代码然后这个选项不适合你。这是一个参考 https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Example/Filters/PassThruResponseFilter.cs#L17
我所做的是通过 javascript 在页面上创建一个元素,其 ID 是 ajax 调用的响应。因此,例如,当您进行 ajax 调用时,为 ajax 调用分配一个 ID。
当ajax调用returns时,在页面上写入一个元素,其中包含预先分配的id和回调信息。然后你就可以用cefsharp从页面中读取元素内容,这将是你的回调信息。
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)
}
Then later with 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);
});
Then read the texarea from cefsharp in c#
chromeBrowser.GetMainFrame().EvaluateScriptAsync(函数()...$(textareaInfo).value).Result