WinForms CefSharp浏览器本地存储不工作

7
我正在尝试在WinForms应用程序中使用CefSharp浏览器控件,并结合LocalStorage机制。
问题是,应用程序中的浏览器控件更改LocalStorage不会影响其他浏览器窗口,并且它不会从其他Chrome浏览器窗口获取更改。
HTML在本地Chrome浏览器中工作,并更改了localstorage并获得更改通知。
我错过了什么?
C#代码:
    public Form1()
    {
        InitializeComponent();

        CefSharp.Cef.Initialize();

        _browser = new ChromiumWebBrowser(URL_TO_LOAD);
        _browser.BrowserSettings = new CefSharp.BrowserSettings()
        {
            ApplicationCacheDisabled = false,
            FileAccessFromFileUrlsAllowed = true,
            JavascriptDisabled = false,
            LocalStorageDisabled = false,
            WebSecurityDisabled = true,
            JavaScriptOpenWindowsDisabled = false,
            JavascriptDomPasteDisabled = false
        };
        _browser.Load(URL_TO_LOAD);

        splitContainer1.Panel1.Controls.Add(_browser);
    }

HTML:

 <!DOCTYPE html>
 <html lang="en">
 <head>
      <meta charset="utf-8"/>
      <meta name="viewport" content="width=620"/>
      <title>HTML5 Demo: Storage Events</title>
 </head>
<body>
    <div>
        <p>
            <label for="data">Your test data:</label> <input type="text"
                name="data" value="" placeholder="change me" id="data" /> 
        </p>
        <p id="fromEvent">Waiting for data via<code>storage</code>event...
        </p>
    </div>
    <SCRIPT type="text/javascript">
    var addEvent = (function () {
          if (document.addEventListener) {
            return function (el, type, fn) {
              if (el && el.nodeName || el === window) {
                el.addEventListener(type, fn, false);
              } else if (el && el.length) {
                for (var i = 0; i < el.length; i++) {
                  addEvent(el[i], type, fn);
                }
              }
            };
          } else {
            return function (el, type, fn) {
              if (el && el.nodeName || el === window) {
                el.attachEvent('on' + type, function () { return fn.call(el, window.event); });
              } else if (el && el.length) {
                for (var i = 0; i < el.length; i++) {
                  addEvent(el[i], type, fn);
                }
              }
            };
          }
        })();
    </SCRIPT>
    <script>
        alert("localStorage: " + localStorage);

        var dataInput = document.getElementById('data'), output = document
                .getElementById('fromEvent');
        addEvent(window, 'storage', function(event) {
            alert('change notification');
            if (event.key == 'storage-event-test') {
                output.innerHTML = event.newValue;
            }
        });
        addEvent(dataInput, 'keyup', function() {
            localStorage.setItem('storage-event-test', this.value);
        });

        var curStorageVal = localStorage.getItem('storage-event-test');
        if(curStorageVal != null && curStorageVal != '')
        {
            output.innerHTML = curStorageVal;
        }
    </script>


</body>
</html>  
2个回答

9
除非您在一个CefSharp.CefSettings对象中设置了缓存位置的路径并将其传递给Cef.Initialize()方法,否则每次启动您的应用程序时,浏览器都会创建一个新的缓存实例,并在应用程序退出时丢弃它。
缓存实例还保存您的localStorage数据,以及任何cookie (您可能想要保持用户登录状态?)和其他一些东西。
我之前也遇到了同样的问题,但在这里找到了解决方案: https://github.com/cefsharp/CefSharp/blob/v39.0.2/CefSharp.Example/CefExample.cs#L30-L32 最简单的解决方案之一是将以下内容添加到您的应用程序的启动过程中,例如在您的Program.Main或在您的情况下,您的Form1类的构造函数中:
var settings = new CefSharp.CefSettings
{
    CachePath = "cache"
};

CefSharp.Cef.Initialize(settings);

0

1. 从NuGet包管理器获取以下内容:
using CefSharp; using CefSharp.WinForms;

2. 为您的CefSetting创建实例:
CefSettings settings = new CefSettings(); settings.CachePath = @"C:\localstorage";

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接