【问题标题】:CefSharp - Get result of AJAX requestCefSharp - 获取 AJAX 请求的结果
【发布时间】:2016-05-10 14:20:43
【问题描述】:

我是 CefSharps Chromium 浏览器的新手,很难弄清楚如何获取 jquery ajax 请求的结果。

我的第一次尝试是将我的 AJAX 请求传递给EvaluateScriptAsync。实际上脚本有效。它完全符合我的要求,但我没有得到任何结果/状态代码,因为我的 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,但我没有正确理解如何实现它。谁能帮帮我?

提前致谢。

【问题讨论】:

  • 如果您在匿名闭包中返回了一个值,那么它将作为EvaluateScriptAsync 的结果返回。您可以将参数作为 json 返回,然后在C# 中执行WebRequest,完成后执行更多JS 以更新您的UI。我不特别推荐这种方法,请参阅下面的替代方法。

标签: javascript c# jquery ajax cefsharp


【解决方案1】:

首先SchemeHandler 不太适合这种情况,您通常会在提供响应时实现SchemeHandler

大多数人选择绑定一个对象,并在他们希望与父应用程序通信时调用绑定对象上的方法。有关示例,请参见 FAQhttps://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

【讨论】:

  • wiki 的链接真的很有帮助。我没想过绑定对象……这对我来说确实是一个很好的解决方案。我今晚要尽快测试它。事实上,不,我对 C++ 不是很满意。我知道一些基本的 C++,但我认为它还不够深入,无法理解如何使用该方法。一有空闲时间,我就会尝试一下,但与此同时,我很确定会选择第一个解决方案,即绑定该对象。
【解决方案2】:

我所做的事情是通过 javascript 在页面上创建一个元素,其 ID 是 ajax 调用的响应。例如,当您进行 ajax 调用时,为 ajax 调用分配一个 ID。

当ajax调用返回时,在页面上写一个元素,带有预先分配的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)
}

后来用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);
});

然后在c#中从cefsharp读取texarea

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-02
    • 2013-04-14
    • 2015-01-06
    • 2012-09-02
    • 1970-01-01
    • 2012-09-26
    • 2019-07-23
    • 2015-06-21
    相关资源
    最近更新 更多