CefSharp 和跨域

Posted

技术标签:

【中文标题】CefSharp 和跨域【英文标题】:CefSharp and Crossdomain 【发布时间】:2013-07-30 08:25:03 【问题描述】:

我正在尝试在 .NET 4.0 应用程序中使用 CefSharp web browser。 我从本地存储的 html 和 js 内容加载页面。因此网络浏览器使用file:// 协议打开页面。

页面转换是用 jQuery (ajax) 实现的,我得到一个 XMLHttpRequest cannot load file:///XXXXXXXX/Debug/res/www/shared/js/src/views/homeView.html. Cross origin requests are only supported for HTTP.

我尝试使用 Schemehandler 并覆盖 ProcessRequest 函数来处理 file:// 域内的页面加载。

class SchemeHandlerFactory : ISchemeHandlerFactory

    public ISchemeHandler Create()
    
        return new SchemeHandler();
    


class SchemeHandler : ISchemeHandler

    public SchemeHandler()
    
    

    public bool ProcessRequest(IRequest request, ref string mimeType, ref Stream stream)
    
        var uri = new Uri(request.Url);
        var segments = uri.Segments;
        var file = segments[segments.Length - 1];

        var bytes = File.ReadAllBytes(request.Url.Replace("file:///",""));
            stream = new MemoryStream(bytes);
            mimeType = "text/html";

            return true;
    

我在我的表单代码中使用它:

CEF.RegisterScheme("file", new SchemeHandlerFactory());

它不会改变任何东西。

我检查了 CefSharp repo 上的提交日志,它说现在支持 Cross AppDomain 但我该如何使用它? https://github.com/cefsharp/CefSharp/pull/35

我还考虑过重新编译 CefSharp 以将 Access-Control-Allow-Origin 添加到 Web 浏览器在对本地文件执行 GET 操作时返回的所有请求中.

我没有想法。

【问题讨论】:

【参考方案1】:

我找到了解决方案,如果有人需要帮助,这里就是:

  BrowserSettings browserSettings = new BrowserSettings();
  browserSettings.FileAccessFromFileUrlsAllowed = true;
  browserSettings.UniversalAccessFromFileUrlsAllowed = true;
  browserSettings.TextAreaResizeDisabled = true;
  string urlToNavigate =
                 Application.StartupPath + @"\res\www\shared\index.html";
  web_view = new WebView(urlToNavigate, browserSettings);

我们需要将 FileAccessFromFileUrlsAllowed 设置为 trueUniversalAccessFromFileUrlsAllowed

【讨论】:

你的答案可能是正确的。但是,需要注意一个非常重要的注意事项:跨应用程序域与网络意义上的跨域不同。它们是两个非常非常不同的东西。 AppDomains 是一个复杂的概念,可用于将 .NET 应用程序划分为“可卸载”的独立部分。因此它们的名称相似,但功能却大不相同。【参考方案2】:

此代码适用于 CEFr3.2987.1601 (Windows 窗体)

browser = new ChromiumWebBrowser("www.websites.com")
            
                Dock = DockStyle.Fill,
            ;
toolStripContainer.ContentPanel.Controls.Add(browser);

//browser.BrowserSettings.WebSecurity = CefState.Disabled;
browser.BrowserSettings.FileAccessFromFileUrls = CefState.Enabled;
browser.BrowserSettings.UniversalAccessFromFileUrls = CefState.Enabled;

https://github.com/cefsharp/CefSharp/issues/1397

要非常小心

//browser.BrowserSettings.WebSecurity = CefState.Disabled;

此代码使您的计算机容易受到恶意攻击。

【讨论】:

以上是关于CefSharp 和跨域的主要内容,如果未能解决你的问题,请参考以下文章

cefsharp支持.net 4.0吗

cefsharp关不掉

CefSharp应用——程序输出

cefsharp停止request

CefSharp试用

CefSharp - 无法加载文件或程序集“CefSharp.Core.dll”或其依赖项之一