您如何在 WCF 服务中使用 CefSharp?

Posted

技术标签:

【中文标题】您如何在 WCF 服务中使用 CefSharp?【英文标题】:How do you use CefSharp in a WCF Service? 【发布时间】:2015-10-05 02:15:10 【问题描述】:

我正在尝试在 WCF 服务应用程序中使用 CefSharp.OffScreen(41.0.0) Nuget 包,并且在尝试从 Visual Studio 2013 运行服务时遇到以下错误:

无法加载文件或程序集“CefSharp.BrowserSubprocess.Core.DLL” 或其依赖项之一。找不到指定的模块。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.IO.FileNotFoundException:无法加载 文件或程序集“CefSharp.BrowserSubprocess.Core.DLL”或其之一 依赖关系。找不到指定的模块。

提到的程序集存在于项目的 bin 文件夹中,以及CefSharp's Website 中列出的所有必需的程序集。如果实际上需要另一个组件,我还没有弄清楚它是什么。

还有几点值得一提:

很容易重现:从VS2013的“WCF服务应用程序”模板开始,只需添加CefSharp.Offscreen Nuget包。 我在 x86 中构建项目。 CefSharp 还依赖于 Visual Studio C++ 2012 可再发行组件。 我将这些文件复制到 bin 文件夹中,但仍然出现相同的错误。 我尝试了 SO 问题 here 中的解决方案,但无济于事。 CefSharp 从控制台应用程序或 WPF 引用时工作正常 申请。

【问题讨论】:

Cef.Initialize() 有一个 performDependencyCheck 参数。它是否返回错误? 尚未向项目中添加任何代码(WCF 服务应用程序模板附带的代码除外)。我只通过 CefSharp.Offscreen nuget 包添加了 CefSharp 引用。 如果您比较项目引用,它们是否与您的控制台应用程序相同?应该只有CefSharpCefSharp.CoreCefSharp.OffScreen?不应该引用BrowserSubProcess,它是在您的应用程序运行时生成的,它不是依赖项。 看起来 Asp.Net 不能很好地处理 unmanaged 组合。我相信您面临的问题已在***.com/questions/17332895/… 中概述 github上有一个类似的问题,最好加入那里的对话github.com/cefsharp/CefSharp/issues/1127#issuecomment-122331752 【参考方案1】:

几分,

IIS 无法访问桌面

所以你不能运行任何需要桌面的东西。您的控制台和 WPF 应用程序可以访问桌面,称为用户交互进程。

CEF 需要桌面

Cef 需要窗口管理器来创建窗口,没有它它不能渲染页面。这就是原因,这里的错误是误导性的,因为 IIS 无法加载需要桌面交互的依赖程序集,除非在 Windows 服务中为 IIS 进程选择了Allow service to interact with Desktop

控制台应用程序是登录的唯一选项

您必须将应用程序作为控制台运行,并且您需要登录到桌面,允许 IIS 与桌面交互不是一个好的选择,我什至不知道它可能会出现什么样的问题。

您可以通过修改注册表和在启动时设置控制台应用程序来将服务器设置为自动登录某些用户。因此,每次重新启动服务器时,您的服务器都会自动登录到指定的用户,并且您的控制台应用程序将启动。 (Windows 8.1 难度不大,但您会得到一些解决方案)。

具有桌面访问权限的自定义 Windows 服务

您可以将您的应用程序类型更改为 Windows 服务而不是控制台,并且您可以安装允许访问本文中显示的桌面的 Windows 服务,请注意,存在一些问题,即只有当有人登录到服务器时这才有效。

http://www.codeproject.com/Articles/4891/Interact-With-Desktop-when-Installing-Windows-Serv

PhantomJS 无头浏览器

有 PhantomJS 无头浏览器,您可以在 IIS/Windows 服务中运行而无需与桌面交互,但是您需要将代码转换为 javascript 而不是 C#。还有其他库可以从您的应用中管理 PhantomJS。

【讨论】:

CefSharp.Offscreen 是否仍需要访问桌面?我认为它没有创建任何窗口。如果我错了,请纠正我。 您所说的IIS服务是否称为“Windows进程激活服务”。我没有看到任何名称中包含 IIS 的服务。 我认为它是万维网服务,即使它说 CefSharp.Offscreen,它只是不显示窗口,但我认为它确实需要桌面,因为 Windows 不会加载所需的相关 GUI 库。我不确定,但我稍后会看看。 @AkashKava 您是否找到有关 CefSharp.Offscreen 项目的任何信息。没有在网络托管环境中使用 CefSharp 的解决方案吗?【参考方案2】:

根据this link 看来,解决这个问题的方法是在 [STAThread] 线程中运行 CefSharp 代码。

【讨论】:

以上是关于您如何在 WCF 服务中使用 CefSharp?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 在 C# 中调试 localhost 客户端/服务

关于WCF中协议使用的场景

WCF 单元测试

如何使用性能计数器监控 WCF 服务正常运行时间?

如何避免 jquery ajax 中使用 wcf 服务的跨域策略?

如何从基于 REST 的 WCF 服务中读取授权标头?