如何在WCF服务中使用CefSharp?

20

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

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

描述:执行当前 Web 请求期间出现未经处理的异常。有关错误的详细信息以及代码中起源的位置,请参见堆栈跟踪。

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

上述程序集存在于项目的bin文件夹中,以及CefSharp的网站列出的所有必需程序集。如果确实需要其他程序集,则我还没有弄清楚它是什么。

值得一提的几点:

  • 易于复现:使用VS2013的“WCF服务应用程序”模板,只需添加CefSharp.Offscreen Nuget包即可。
  • 我在x86中构建了该项目。
  • CefSharp还依赖于Visual Studio C ++ 2012可再发行程序包。我将这些文件复制到了bin文件夹中,但仍然遇到相同的错误。
  • 我尝试了此处的SO问题解决方案,但没有用。
  • CefSharp在从控制台应用程序或WPF应用程序引用时运行良好。

Cef.Initialize()有一个performDependencyCheck参数。它会返回错误吗? - amaitland
如果你比较项目的引用,它们与你的控制台应用程序一样吗?只应该有 CefSharpCefSharp.CoreCefSharp.OffScreen 这三个引用吗?不应该有对 BrowserSubProcess 的引用,它会在应用程序运行时自动生成,而不是一个依赖项。 - amaitland
在 GitHub 上有一个类似的问题,最好加入那里的讨论 https://github.com/cefsharp/CefSharp/issues/1127#issuecomment-122331752 - amaitland
如果您在 GitHub 上发布,您可以看到其他用户是否成功。 - amaitland
你是在IIS中运行还是自托管服务?如果在IIS中,请查看应用程序池,它可能需要启用32位应用程序(如果您正在为x86构建),可以在高级设置中进行设置。我也遇到过类似的问题。或者尝试以x64运行,但请确保所有项目都设置为构建相同的内容。 - Kevin Green
显示剩余4条评论
2个回答

4

几点需要注意:

IIS无法访问桌面

因此,您不能运行需要桌面的任何程序。您的Console和WPF应用程序可以访问桌面并被称为用户交互进程。

CEF需要桌面

Cef将需要窗口管理器来创建窗口,否则它无法渲染页面。这就是错误在这里误导的原因,因为IIS无法加载需要与桌面交互的依赖项,除非在Windows服务中选择了允许服务与桌面交互以用于IIS进程。

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

您需要将应用程序运行为控制台,并且您需要登录到桌面。允许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仍然需要访问桌面吗?我认为它不会创建任何窗口。如果我错了,请纠正我。 - Galen
你所指的IIS服务是指“Windows Process Activation Service”吗?我没有看到任何包含IIS名称的服务。 - Galen
我认为这是一个全球网络服务,即使它说是CefSharp.Offscreen,它也不会显示窗口,但我认为它确实需要桌面,因为Windows不会加载必需的GUI库。我不确定,但稍后我会查看。 - Akash Kava
@AkashKava,你有没有找到关于CefSharp.Offscreen项目的任何信息?难道不能在Web托管环境中使用CefSharp的解决方案吗? - Robar

0
根据此链接显示,解决此问题的方法是在[STAThread]线程中运行CefSharp代码。

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