CefSharp Javascript 注册和执行在版本 79.1.36 中不起作用

CefSharp Javascript registration and execution is not working in Release 79.1.36

我尝试将 CefSharp 从版本 69.0.0.0 升级到 79.1.36。 我无法使 Javascript 交互正常工作。 注册变更自

this.Browser.RegisterJsObject

this.Browser.JavascriptObjectRepository.Register

根据https://github.com/cefsharp/CefSharp/issues/2990.

当我执行 EvaluateScriptAsync 时,我收到状态已取消的响应。

为了了解如何正确实现它,我检查了 CefSharp.WpfExample 并注意到示例 WPF 应用程序中的 Javascript 功能也不起作用。 单击 运行 按钮时,执行 Javascript(异步)不会执行任何操作。 评估 Javascript(异步)returns:

Uncaught ReferenceError: bound is not defined @ about:blank:1:0

Javascript 功能在最新版本中是否中断?

更新

下面是它在我们的代码中的使用方式。

这是注册

public void RegisterJavaScriptHandler(string name, object handler)
{
    try
    {
        CefSharpSettings.LegacyJavascriptBindingEnabled = true;
        this.Browser.JavascriptObjectRepository.Register(name, handler, false, new BindingOptions() { CamelCaseJavascriptNames = false });
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

这是 EvaluateScriptAsync 部分

public void InitializeLayers()
{
    try
    {
        int count = _mapLogic.Layers.Count();
        foreach (WMSLayer layer in _mapLogic.Layers)
        {
            if (!_loadedLayers.Contains(layer))
            {
                var script = string.Format("addWMSLayer('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}')",
                    layer.ProviderCode.Url, layer.AttributionText, layer.AttributionHref,
                    layer.Layer, layer.FormatCode.Format, layer.ServerType, layer.Res1, layer.Res2, layer.Res3, layer.Res4);

                var response = this.ECBBrowser.Browser.EvaluateScriptAsync(script, new TimeSpan(0, 0, 1));
                response.ContinueWith(t =>
                {
                    count--;
                    if (count == 0) this.initializeMap();

                });
                _loadedLayers.Add(layer);
            }
            else
            {
                count--;
                if(count == 0) this.initializeMap();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

更新二

我现在相信资源加载发生了一些变化。 这就是我的(不重要的部分被遗漏了)。

public class ECBSchemeHandler : IResourceHandler
{
    private string _mimeType;
    private Stream _stream;

    public bool Open(IRequest request, out bool handleRequest, ICallback callback)
    {
        var result = open(request, callback);
        handleRequest = result;
        return result;
    }

    public bool Read(Stream dataOut, out int bytesRead, IResourceReadCallback callback)
    {
        return read(dataOut, out bytesRead, callback);
    }

    public bool ReadResponse(Stream dataOut, out int bytesRead, ICallback callback)
    {
        return read(dataOut, out bytesRead, callback);
    }

    private bool open(IRequest request, ICallback callback)
    {
        var u = new Uri(request.Url);
        var file = u.Authority + u.AbsolutePath;

        var ass = Assembly.GetExecutingAssembly();
        var resourcePath = ECBConfiguration.DEFAULT_ASSEMBLY_NAMESPACE + "." + file.Replace("/", ".");

        if (ass.GetManifestResourceInfo(resourcePath) != null)
        {
            Task.Run(() =>
            {
                using (callback)
                {
                    _stream = ass.GetManifestResourceStream(resourcePath);
                    var fileExtension = Path.GetExtension(file);
                    _mimeType = ResourceHandler.GetMimeType(fileExtension);
                    callback.Continue();
                }
            });
            return true;
        }
        else
        {
            callback.Dispose();
        }           

        return false;
    }

    private bool read(Stream dataOut, out int bytesRead, IDisposable callback)
    {
        callback.Dispose();

        if (_stream == null)
        {
            bytesRead = 0;
            return false;
        }

        //Data out represents an underlying buffer (typically 32kb in size).
        var buffer = new byte[dataOut.Length];
        bytesRead = _stream.Read(buffer, 0, buffer.Length);

        dataOut.Write(buffer, 0, buffer.Length);

        return bytesRead > 0;
    }
}

}

使用@amaitland 指出的内置 ResourceHandlers 解决了 Javascript 注册的问题。