在IIS

时间:2018-01-21 23:14:07

标签: c# asp.net r iis r.net

我们尝试从IIS中的ASP.Net网页运行R.net,但遇到R引擎无法访问外部库的问题。我知道这是一个常见的问题,但是当涉及到IIS(只有来自VS内部的IIS表达)时,典型的解决方案无法发挥作用。

例如,当尝试使用' colorRampPalette'在依赖于DLL的R中,出现以下错误消息:

" inDL(x,as.logical(local),as.logical(now),...)出错:无法加载共享对象' C:/ Program Files / R / R -3.4.2 / library / stats / libs / x64 / stats.dll':LoadLibrary失败:找不到指定的模块。"

不是stats.dll是问题,而是它引用的另一个DLL。

现在,使用R中的函数可以正常工作。在VS调试中使用R.net中的函数工作正常。但是,从IIS运行它不起作用。通常情况下,它只是一个路径变量而无法使其工作,但这似乎并非如此。

我们尝试了什么:

  • 确保PATH变量具有必要的文件夹(即C:\ Program Files \ R \ R-3.4.3 \ bin \ x64等)。如果这是错误的,那么R.net就不会在本地工作,而且我也验证了IIS没有重置已在其他来源中指出的PATH变量。当我从IIS内部检查PATH变量时,列出了必要的文件夹。
  • 在IIS下运行时检查R.net中的库,主页和bin路径是否正确。
  • 确保IIS_IUSRS用户具有对必要文件夹和文件的读/写权限。
  • 验证了R代码是否正确。

这似乎是一个常见问题,但大多数解决方案都是指确保PATH变量是正确的,在这种情况下这根本就不够。

我们正在运行(亚马逊网络服务): Windows Server 2016 x64, IIS 10, R.NET 1.7, C#4.5.2, R 3.4.2

我也尝试过使用类似设置的另一台(非AWS)服务器。

任何可能导致这种情况的想法?由于很多人都遇到了R.Net和IIS的问题,我怀疑有人遇到了PATH变量不够的问题吗?

2 个答案:

答案 0 :(得分:0)

我正在解决同样的问题。对于IIS我没有找到解决方案。我也在调试R.NET代码,但通过设置R文件夹的正确路径的解决方案不起作用。

解决方案是创建附加层,其中包括运行R项目(实际上创建自己的R服务器)。我使用自托管WCF服务,

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-host-a-wcf-service-in-a-managed-windows-service

这实际上是控制台应用程序,并且有利于在IIS应用程序池中运行的应用程序。该解决方案还涵盖了单例REngine问题。如果您在IIS中运行实例或REngine,则无法通过停止应用程序池来处置它。对于自托管服务,您可以设置触发器,以便在内存泄漏时重新启动应用程序。

在此实现过程中,我发现问题在控制台应用程序的调试模式下再次运行R.NET R 3.4.3我得到错误"库" ..."无法加载",所以我使用了R 3.4.2。哪个好看。需要86x安装 - 独立于64x / ANYCPU环境中运行的应用程序。

您是否找到了其他解决方案?

答案 1 :(得分:0)

如user2967150所述,问题不是由stats.dll引起,而是由它引用的另一个DLL。 经过大量研究后,我发现它尝试在'C:/ Program Files / R / R-3.4.2 / library / stats / libs / x64 /路径中找到Rlapack.dll。 所以您只需要从'C:\ Program Files \ R \ R-3.4.4 \ bin \ x64 \ Rlapack.dll'复制Rlapack.dll 到'C:/ Program Files / R / R-3.4.2 / library / stats / libs / x64 /。 之后,Web应用程序可以访问外部R库。

注意:我假设您的Web应用程序在本地运行,但是当您尝试在IIS上运行它时会出现问题。