DotNetBrowser - 从 V1 升级到 V2 时出现异常

DotNetBrowser - Exceptions when Upgrading from V1 to V2

提问人:Justin W. 提问时间:11/1/2023 最后编辑:Justin W. 更新时间:11/7/2023 访问量:65

问:

我最近开始从 TeamDev 的 DotNetBrowser 的 V1 版本迁移,我遇到了多个困扰我的问题。

以前,所有 Chromium 二进制文件都可以很好地协同工作,并内置到 NuGet 包中。主要的缺点是启动我的应用程序的多个实例导致用户目录被重用,所以我在几年前就解决了这个问题。

早在 2020 年,我就收到了 V2 的新许可证密钥,所以我想我终于可以开始升级了,因为现在有很多新东西可以使用。在提出这个问题时,我升级到了最新版本 2.24.1。

我仔细检查并彻底检查了 Javascript 调用/执行的所有转换以使用新的方式,但到目前为止,最大的障碍是让引擎工作。

在调试中,处理新的 EngineFactory.Create 调用需要几分钟时间。似乎大多数时候可能是由于下载或提取Chromium dll。一半的时间返回“RPC 调用超时”,另一半的时间返回消息“无法执行此操作,因为对象已被释放”。当它在多次重试后确实工作时,它最终会创建一个 IEngine,但是当尝试直接创建 IProfile 或 IBrowser 时,它也会遇到“无法执行此操作,因为与 Chromium 的连接已关闭”的异常。

下面是构造函数中调用的有问题的代码片段:

            string base_data_directory = @"C:\test";
            string chromium_directory = base_data_directory + @"\chromium_dir";

            EngineOptions engineOptions = new EngineOptions.Builder
            {
                ChromiumDirectory = base_data_directory,
                CrashDumpDirectory = chromium_directory + @"\CrashDump\",
                UserDataDirectory = chromium_directory + @"\User\",
                SandboxDisabled = true
            }.Build();
            IEngine engine = EngineFactory.Create(engineOptions);

我没有运行任何其他实例,并且在异常发生之前,初始化时间始终是几分钟。

经过一番挖掘,我在他们的一个常见问题解答中读到,他们的许可证仅对许可证有效时发布的版本有效。虽然我没有收到任何与许可证相关的异常,但我想我会尝试回滚,所以我删除了新的 NuGet 包并安装了 2.1.1,这是我的许可证范围内发生的最后一个版本。

例外情况确实发生了变化,但更改为“无法找到或恢复兼容的 Chromium 二进制文件。在程序集中找不到兼容的二进制文件“,并且通过 NuGet 挖掘,他们似乎没有公开发布的 2.1.1 版 Chromium 包。

还有其他人遇到过这个问题吗?我想最终获得一个新的许可证密钥,但是如果启动时间(这是不可接受的时间增加)和创建时引擎的随机 RPC/处置问题,我可能会回到版本 1。

编辑 2023.11.03: 我附上了每个 Anna 生成的日志的主要部分(非常感谢!

    2023-11-03T15:51:20.8094415-07:00  Information      IPC - Current platform: WindowsX64 []
    2023-11-03T15:51:20.8094415-07:00  Information      IPC - .NET version: 4.0.30319.42000 []
    2023-11-03T15:51:21.0369928-07:00  Information      IPC - Assembly version: 2.24.1.3989 []
    2023-11-03T15:51:21.0369928-07:00  Information      IPC - Binaries version: 2.24.1.902 []
    
2023-11-03T15:51:21.1463823-07:00      Warning  Process - [41092:21456:1103/155121.145:WARNING:chrome_main_delegate.cc(615)] This is Chrome version 118.0.5993.70 (not a warning) []
2023-11-03T15:51:21.1880668-07:00      Warning  Process - [41092:21456:1103/155121.148:WARNING:policy_logger.cc(148)] :components\enterprise\browser\controller\chrome_browser_cloud_management_controller.cc(88) Could not create policy manager as CBCM is not enabled. []
2023-11-03T15:51:21.1920502-07:00  Information      IPC - Accepting incoming connection... []
2023-11-03T15:51:21.3384778-07:00  Information      IPC - Shared memory created. Memory id: 8ba7a88c-3470-4055-b153-8b7829fc9fee []
2023-11-03T15:51:21.3404718-07:00  Information      IPC - Accepting incoming connection: Browser, ConnectionId{Uuid: 8ba7a88c-3470-4055-b153-8b7829fc9fee; } []
2023-11-03T15:51:21.3474548-07:00  Information      IPC - Accepting socket connections []
2023-11-03T15:51:21.3494490-07:00  Information      IPC - Socket connection checker started [SocketConnectionChecker: Connection Browser,ConnectionId{Uuid: 8ba7a88c-3470-4055-b153-8b7829fc9fee; } [Writer : 8ba7a88c-3470-4055-b153-8b7829fc9fee]]
2023-11-03T15:51:21.3594229-07:00      Warning  Process - [41092:21456:1103/155121.353:WARNING:pref_notifier_impl.cc(41)] Pref observer for browser.relaunch_window found at shutdown. []
2023-11-03T15:51:21.3594229-07:00      Warning  Process - [41092:21456:1103/155121.353:WARNING:pref_notifier_impl.cc(41)] Pref observer for browser.relaunch_notification_period found at shutdown. []
2023-11-03T15:51:21.3614186-07:00  Information      IPC - System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.IO.StreamReader.ReadBuffer()
   at System.IO.StreamReader.ReadToEnd()
   at DotNetBrowser.Internals.Ipc.Connections.ConnectionChecker.Run() [SocketConnectionChecker: Connection Browser,ConnectionId{Uuid: 8ba7a88c-3470-4055-b153-8b7829fc9fee; } [Writer : 8ba7a88c-3470-4055-b153-8b7829fc9fee]]
2023-11-03T15:51:21.3614186-07:00  Information      IPC - Connection socket closed [SocketConnectionChecker: Connection Browser,ConnectionId{Uuid: 8ba7a88c-3470-4055-b153-8b7829fc9fee; } [Writer : 8ba7a88c-3470-4055-b153-8b7829fc9fee]]
2023-11-03T15:51:21.3614186-07:00  Information  License - One or more product licenses were located []
2023-11-03T15:53:28.0658298-07:00  Information  Process - Chromium process exit code 00000026 []
2023-11-03T15:53:28.0658298-07:00  Information      IPC - Stopping server... []
2023-11-03T15:53:28.0668290-07:00  Information      IPC - Server stopped. []
2023-11-03T15:53:28.0668290-07:00  Information      IPC - Stopping server... [OK] []
2023-11-03T15:53:28.1072106-07:00        Error      IPC - Failed to send RPC request: rpc.EngineFactory.ApplyLicense.

根据该信息,在应用许可证时,它似乎正在调用并失败。

编辑 11/6/2023:

似乎不仅仅是用户数据目录导致了这个问题,还有故障转储和 Chromium 目录。 我在 Windows 11 PC 上没有遇到这个问题,但我的 Windows 10 PC 对我非常生气。

我最终通过每个关联目录上的以下内容解决了这个问题:

    private DirectoryInfo MakeDirectoryAndUpdateSecuritySettings(string directory)
    {
        DirectoryInfo dir = Directory.CreateDirectory(directory);
        dir.Attributes &= ~FileAttributes.ReadOnly;
        DirectorySecurity security = dir.GetAccessControl();
        SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
        security.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
        dir.SetAccessControl(security);
        return dir;
    }

再次感谢安娜和卡特琳娜!

异常 升级 chromium nuget-package dotnetbrowser

评论

0赞 Anna Dolbina 11/2/2023
请启用 DotNetBrowser 日志并将输出附加到问题:''' LoggerProvider.Instance.Level = SourceLevels.All;LoggerProvider.Instance.FileLoggingEnabled = true;LoggerProvider.Instance.OutputFile = @“C:\test\dotnetbrowser.log”;''' 此代码应放在调用之前。EngineFactory.Create()
0赞 Anna Dolbina 11/5/2023
据我了解,您已经截断了日志以删除敏感信息。是否指定了自定义用户数据目录?它是否指向可写位置?在日志中,有一个 Chromium 命令行,其中包含用户数据的路径作为其参数之一。
0赞 Justin W. 11/6/2023
是的。自定义用户数据目录与 chromium 目录相同,并在路径中附加了“UserData”文件夹。是否应该将其移出 Chromium 目录并移入单独的目录中?在 1x 版本中似乎不需要它。
0赞 Anna Dolbina 11/6/2023
根据代码片段,用户数据目录应为“C:\test\chromium_dir\User\”。路径本身是可以接受的,但是,您需要检查此位置对于启动 .NET 应用程序的 Windows 用户是否可写。

答: 暂无答案