使用fastcgi-mono-server4时出现Mono随机CS0006编译错误

4
我正在尝试使用带有fastcgi-mono-server4的mono 2.10.8.1,在我的Linux服务器上部署一个在Mono / OSX上开发的ASP MVC项目。Web应用程序始终可以正常启动,但是随后我开始收到各种URI的随机CS0006编译错误,并且一旦它们出错,它们就会保持出错状态,直到我重新启动服务器应用程序。以下是一个示例错误:
Server Error in '/' Application

Compilation Error

Description: Error compiling a resource required to service this request. Review your source file and modify it to fix this error.

Compiler Error Message: CS0006: Metadata file `/tmp/root-temp-aspnet-0/ed68754/App_global.asax_40e709ea.dll' could not be found

~/Views/Order/Download.aspx

这里有一个相关帖子(链接)是从一月份开始的,但问题和答案似乎都是mod_mono特定的,并且比较模糊。有没有人有关于如何调试/解决/绕过此问题的建议?这让人非常沮丧。特别是,是否有任何“不支持”的变通方法,我可以从我的Windows Server机器上复制某些东西以使用MS实现,而不是有缺陷的mono?

(我也提交了一个错误报告。)


这很奇怪,似乎它正在尝试在依赖于尚未生成的dll时编译视图。您尝试过更新到更高版本的mono吗?我已经尝试过使用mono 2.10.5的fastcgi-mono-server和mod_mono,从未遇到过这个问题。 - Marcelo Zabani
2个回答

2

由于错误似乎与Mono JIT试图编译不存在的临时文件有关,我花了几天时间尝试不同的解决方法(而不是解决它)。一个有效的解决方案是在Windows上使用aspnet_compiler创建二进制版本,该版本可以直接复制并在Linux / Mono上运行(因为最新版本的Mono现在支持预编译的ASP.NET应用程序)。

然而,我正在寻找本地的Linux解决方案,并且不想将二进制文件编译和同步(而是同步代码的GIT存储库)到服务器,因此当我发现Mono提前编译时,我正在寻找另一个解决方案,这几乎相当于Windows上的ngen.exe。

虽然它不能预编译所有内容,但它似乎已经解决了问题。对我来说,这个部署脚本可以在没有任何运行时构建失败的情况下完成工作:

xbuild SystemDiscs.sln
mono --aot -O=all SystemDiscs/bin/SystemDiscs*.dll
killall -9 mono
nohup fastcgi-mono-server4 /socket=tcp:127.0.0.1:8000 /applications=/:/var/asp/S
ystemDiscs/SystemDiscs/ > /var/log/systemdiscs.log &

其中SystemDiscs*.dll是在第一步使用xbuild编译的解决方案的输出。我认为这不会预编译ASP页面(而且据我所知,在x86上不支持--aot=full),但不知何故它完成了工作。我一直在等待看看这是否只是偶然事件,但自从十天前我提出这个问题以来,已经有大约十几个提交/部署了,所以我认为可以肯定它有效。


1
我有一个类似的问题:

Compilation Error

Description: Error compiling a resource required to service this request. Review your source file and modify it to fix this error.

Compiler Error Message: CS0006: Metadata file `/tmp/<DOMAIN/>/<username/>-temp-aspnet-0/5ed74d00/App_global.asax_34cccb99.dll' could not be found
/Default.aspx

但这与预编译无关,而与我的用户名中的反斜杠有关。我使用likewise-open登录到Windows域,因此我的用户名是<DOMAIN/>\<username/>,而我的主目录没有反斜杠:/home/likewise-open/<DOMAIN/>/<username/>。这种差异或仅仅是反斜杠本身导致了mono找不到临时目录中编译的global.asax。如果你仔细观察详细的输出,你会发现在输出参数中的反斜杠\被改为了正斜杠/:

dmcs /target:library /lib:"/home/likewise-open/<DOMAIN/>/<username/>/Documents/test9999/test9999/bin" /debug+ /optimize- /warn:4 /out:"/tmp/<DOMAIN/>\<username/>-temp-aspnet-0/5ed74d00/App_Web_17ca7bdd.dll" /r:"/usr/lib/mono/4.0/mscorlib.dll" /r:"/usr/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll" /r:"/usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll" /r:"/usr/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll" /r:"/usr/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll" /r:"/usr/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll" /r:"/usr/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll" /r:"/usr/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll" /r:"/usr/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll" /r:"/usr/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll" /r:"/usr/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll" /r:"/usr/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll" /r:"/usr/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll" /r:"/usr/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll" /r:"/usr/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll" /r:"/usr/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll" /r:"/usr/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll" /r:"/usr/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll" /r:"/usr/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll" /r:"/usr/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll" /r:"/usr/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll" /r:"/usr/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll" /r:"/usr/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll" /r:"/home/likewise-open/<DOMAIN/>/<username/>/Documents/test9999/test9999/bin/test9999.dll" /r:"/tmp/<domain/>/<username/>-temp-aspnet-0/5ed74d00/App_global.asax_34cccb99.dll"  /nowarn:0169 /d:DEBUG  -- "/tmp/<DOMAIN/>\<username/>-temp-aspnet-0/5ed74d00/App_Web_17ca7bdd_0.cs" 

所以:
/out:"/tmp/<DOMAIN/>\<username/>-temp-aspnet-0/5ed74d00/App_Web_17ca7bdd.dll 

变成

/tmp/<DOMAIN/>/<username/>-temp-aspnet-0/5ed74d00/App_global.asax_34cccb99.dll

如果我将目录5ed74d00复制到/tmp/<DOMAIN/>/<username/>-temp-aspnet-0/,则应用程序按预期工作。

我花了将近两天的时间才看到这一点,希望我的答案能帮助其他人。


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