【问题标题】:Non-Null Domain Name Breaks Page非空域名中断页面
【发布时间】:2020-01-07 18:32:33
【问题描述】:

我们让 CefSharp 调用部署在 IIS 上的项目。那行得通。我需要的第三方库的cookie也加载成功了。

现在我们希望 CefSharp 通过磁盘加载相同的 html 和第三方库,绕过 IIS。文件正在加载并运行完整的 javascript,但是第三方库需要一个“域名”来匹配与许可证关联的域名。

我需要我的域名与我的许可证上使用 domain=localhost 生成的域名相匹配。但是,一旦我指定了域名,页面,包括许可证检查器,就​​不会加载。

这是一个相关的问题。当我使用 csharp 调用 IIS 项目时,我需要加载的 cookie 成功加载,但当我从磁盘打开 html 项目时失败。作为参考,静态 void FrameLoaded 是我项目的两个版本中使用的相同 cookie 加载过程。

程序.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MinRepExample2
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;



namespace MinRepExample2
{
    public partial class Form1 : Form
    {

        private ChromiumWebBrowser browser;
        public Form1()
        {
            InitializeComponent();

            try
            {
                string siteURL = "";
                string FileBase = @"c:\users\romero.ryan\documents\visual studio 2015\Projects\MinRepExample2";
                string CacheDir = FileBase+@"\Cef2";



                // CefSettings to temporarily reduce security
                CefSettings MySettings = new CefSettings();

                MySettings.CachePath = CacheDir;


                MySettings.CefCommandLineArgs.Add("enable-media-stream", "enable-media-stream");
                MySettings.CefCommandLineArgs.Add("allow-file-access-from-files", "allow-file-access-from-files");
                MySettings.CefCommandLineArgs.Add("disable-web-security", "disable-web-security");



                MySettings.JavascriptFlags = "--expose-wasm";



                // Browser Settings

                BrowserSettings browserSettings = new BrowserSettings();
                browserSettings.FileAccessFromFileUrls = CefState.Enabled;
                browserSettings.LocalStorage = CefState.Enabled;
                browserSettings.UniversalAccessFromFileUrls = CefState.Enabled;
                browserSettings.WebSecurity = CefState.Disabled;


                // Custom Scheme Registration
                MySettings.RegisterScheme(new CefCustomScheme
                {
                    SchemeName = MySchemeHandlerFactory.SchemeName,
                    SchemeHandlerFactory = new MySchemeHandlerFactory(),
                    IsFetchEnabled = true,
                    IsLocal = false,
                    IsCorsEnabled = true,
                    IsSecure = true,


                    //DomainName= @"\Users\romero.ryan"
                      DomainName = "localhost"


                });




                CefSharpSettings.LegacyJavascriptBindingEnabled = true;

                if (!Cef.IsInitialized)
                {
                    Cef.Initialize(MySettings);
                }


                //string fName = @"C:\Users\romero.ryan\Documents\Visual Studio 2015\Projects\WinHostScandit1\WebHostOnDisk\CefPrimeFiles";

                //c:\users\romero.ryan\documents\visual studio 2015\Projects\MinRepExample2\TestSite.html



                browser = new ChromiumWebBrowser(@"fileProtocol:\\" + FileBase + "\\TestSite.html");

                browser.BrowserSettings = browserSettings;
                browser.Dock = DockStyle.Fill;

                browser.Name = "browser";

                browser.LoadingStateChanged += FrameLoaded;

                this.Controls.Add(browser);

            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        public  void FrameLoaded(object sender, LoadingStateChangedEventArgs e)
        {

            //ChromiumWebBrowser ans = (ChromiumWebBrowser)Controls.Find("browser", false).First();



            if (!e.IsLoading)
            {
                // CefSharp specific Cookie manipulation to register app as single device used with Scandit Library. 

                // ADD Cookie in C# code. Also adding in javascript code

                var cookman = browser.GetCookieManager();
                string[] schemes = { "fileProtocol", "fileprotocol", "fileprotocol:", "fileProtocol:" };

                cookman.SetSupportedSchemes(schemes, true);

                CefSharp.Cookie cook1 = new CefSharp.Cookie();
                cook1.Domain = "localhost";
                cook1.Name = "scandit-device-id";
                cook1.Value = "ffaf4f340998d137fc260d563004eabcd388e90f";
                cook1.Path = "/scanditpage";
                cook1.Expires = new DateTime(2029, 6, 17);
                // cookman.SetCookieAsync(ConfigurationManager.AppSettings["ScanditURL"], cook1);

                var respcook = cookman.SetCookieAsync("http://localhost/scanditpage/ScanditTest.html", cook1);
                bool cookieSet = cookman.SetCookie("http://localhost/scanditpage/ScanditTest.html", cook1);
                CefSharpSettings.LegacyJavascriptBindingEnabled = true;
                //cookman.SetCookie

                // Adding Test cookie
                browser.ExecuteScriptAsync("TestAddCookie()");

                // Launches Dev tools for Debugging Purposes. 
                browser.ShowDevTools();
            }


        }
    }
}

MySchemeHandler.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CefSharp;
using System.IO;

namespace MinRepExample2
{
    public class MySchemeHandler : ResourceHandler
    {
        public const string SchemeName = "fileProtocol";
        private string folderPath;

        public MySchemeHandler()
        {
            folderPath = "";

        }


        public override CefSharp.CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
        {
            var uri = new Uri(request.Url);
            string fileName = uri.LocalPath;


            var requestedFilePath = "C:/" + fileName;

            string bFileName = "";

            bFileName = requestedFilePath;

            if (File.Exists(bFileName))
            {
                byte[] bytes = File.ReadAllBytes(bFileName);
                Stream = new MemoryStream(bytes);


                var fileExtension = Path.GetExtension(bFileName);
                MimeType = GetMimeType(fileExtension);

                return CefReturnValue.Continue;

                //return true;
            }
            else
            {

                throw new FileNotFoundException();
            }



            callback.Dispose();

            return CefReturnValue.Continue;


        }
    }
}

MySchemeHandlerFactory:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CefSharp;
namespace MinRepExample2
{
    public class MySchemeHandlerFactory: ISchemeHandlerFactory
    {

        public const string SchemeName = "fileProtocol";


        public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
        {
            return new MySchemeHandler();
        }
    }
}

测试 HTML:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Test Site for CefSharp Cookies</title>

    <script type="text/javascript">


        function AddCookie(name, value) {
            // Add cookie as name value pair.
            var newcookie = name + "=" + value + ";";
            document.cookie=newcookie
        }

        function TestAddCookie() {
            // Add specific cookie. Called from executescript in FrameLoaded method
            AddCookie("name", "everlast");

        }

        function ButtonCookie() {
            //Adds cookie by button click, then displays all available cookies. 
            AddCookie("button", "clicked");
            var decodedCookie = decodeURIComponent(document.cookie);
            alert(decodedCookie);
        }

    </script>


</head>
<body>
    <div>Hello, World!</div>
    <button onclick="ButtonCookie();">Add Cookie</button>

</body>
</html>

【问题讨论】:

  • 您错误地设置了 IsLocal = true
  • 如果 IsLocal 留空或设置为 false,问题仍然存在。
  • 你的例子不完整,所以我不能说。请阅读stackoverflow.com/help/minimal-reproducible-example
  • @amaitland,我已经包含了负责加载页面的整个静态类。当我在 Scheme Registration 中注释掉 DomainName 行时,页面可以工作,但是域名不匹配导致第三方库失败。
  • 我可能会关闭这个问题。如果没有成功加载 cookie,该库将无法工作。这可能是它测试域兼容性的唯一方法。一旦我解决了这个问题,这仍然可能是个问题。

标签: cefsharp chromium-embedded


【解决方案1】:

我从 amaitland 的建议和这个答案中找到了答案:Simple Custom Scheme

CefSettings 允许您设置权限,例如允许 CORS 和 Fetch 加载 WASM 文件。 CefSettings 还用于注册自定义方案处理程序。某些方案可能需要特殊权限才能加载依赖的 javascript 库。必须在调用 Cef.Initialize 之前设置与此变量关联的权限。不应在 new ChromiumWebBrowser() 之后调用 Cef.Initialize;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using CefSharp.SchemeHandler;


namespace EpmsMobileWF.ScanditWebForm
{
    public partial class ScanditPopupForm : Form
    {

        public static ScanditPopupConfig scanditConfigs;
        public static JSObj1 mess;
        public ChromiumWebBrowser browser;


        public ScanditPopupForm(TextBox inForm)
        {
            InitializeComponent();
            InitScanner();
            mess = new JSObj1(inForm, this);

        }

        public void  InitScanner()
        {
            scanditConfigs = new ScanditPopupConfig();
            var settings = new CefSettings();
            FolderSchemeHandlerFactory newFac = new FolderSchemeHandlerFactory(scanditConfigs.HTMLRootFolder,null, scanditConfigs.DomainName, "ScanditTest.html");

            CefCustomScheme ScanditScheme = new CefCustomScheme
            {
                SchemeName = "http",
                DomainName = scanditConfigs.DomainName,
                SchemeHandlerFactory = newFac,
            };

            ScanditScheme.IsCorsEnabled = true;
            ScanditScheme.IsFetchEnabled = true;
            ScanditScheme.IsLocal = true;
            ScanditScheme.IsStandard = true;


            settings.CachePath = scanditConfigs.ScanditCacheDirectory;

            settings.CefCommandLineArgs.Add("enable-media-stream", "enable-media-stream");
            settings.CefCommandLineArgs.Add("allow-file-access-from-files", "allow-file-access-from-files");

            settings.PersistSessionCookies = true;
            settings.JavascriptFlags = "--expose-wasm";



            settings.RegisterScheme(ScanditScheme);

            Cef.Initialize(settings);

            browser = new ChromiumWebBrowser(scanditConfigs.ScanditURL);

            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;

        }


    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2016-12-04
    • 2015-02-18
    • 2023-03-08
    相关资源
    最近更新 更多