Mono 3.0.0:无法加载文件或程序集:System.Web.Extensions.dll,Version=4.0.0.0

4

我正在使用mod-mono在Apache中托管一个ServiceStack Web服务,我的mono版本是3.0.0,xsp版本是2.10.2。 我使用mod-mono-server2托管了一个目标为.NET Framework 2.0的hello world示例,并且它工作正常。 然后我将项目更改为目标为.NET Framework 4.0并使用mod-mono-server4。 我遇到了这个错误:

无法加载文件或程序集“System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中的一个或多个依赖项。系统找不到指定的文件。System.IO.FileNotFoundException: 无法加载文件或程序集“System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中的一个或多个依赖项。系统找不到指定的文件。文件名:“System.Web.Extensions,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”。在 System.AppDomain.Load (System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly) [0x00000] in :0 在 System.AppDomain.Load (System.String assemblyString) [0x00000] in :0 在 (wrapper remoting-invoke-with-check) System.AppDomain:Load (string) 在 System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in :0 在 System.Web.Compilation.BuildManager.LoadAssembly (System.Web.Configuration.AssemblyInfo info,System.Collections.Generic.List`1 al) [0x00000] in :0 在 System.Web.Compilation.BuildManager.GetReferencedAssemblies () [0x00000] in :0 在 System.Web.Compilation.BuildManager.CallPreStartMethods () [0x00000] in :0

但是System.Web.Extensions文件已安装在GAC中:

gacutil -l System.Web.Extensions

以下程序集已安装到GAC中: System.Web.Extensions,版本=1.0.61025.0,文化=中性,公钥令牌=31bf3856ad364e35 System.Web.Extensions,版本=3.5.0.0,文化=中性,公钥令牌=31bf3856ad364e35 System.Web.Extensions,版本=4.0.0.0,文化=中性,公钥令牌=31bf3856ad364e35 项目数=3

即使我将MonoPath设置为专门获取4.0版本,仍会出现相同的错误:

MonoPath /usr/local/lib/mono/4.0

我还注意到这一点:

版本信息:Mono运行时版本:2.10.5(tarball Fri Oct 28 10:20:24 IST 2011); ASP.NET版本:4.0.30319.1

虽然我安装了mono-3.0.0,但Mono运行时版本显示为2.10.5,我不知道这个信息对这个问题是否有价值。
我尝试直接运行mod-mono-server4,但出现了以下错误消息:

mod-mono-server4

mod-mono-server4 在程序集 /usr/local/lib/mono/4.0/System.dll 中找不到方法 System.Configuration.IConfigurationSectionHandler::Create(object,object,XmlNode),但在程序集 /usr/local/lib/mono/4.0/System.Configuration.dll 中被引用。 在读取配置文件时遇到异常: System.MissingMethodException: 找不到方法:'System.Configuration.IConfigurationSectionHandler.Create'。 at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000] in :0 at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000] in :0 at System.Configuration.ConfigurationManager.get_AppSettings () [0x00000] in :0 at Mono.WebServer.Apache.Server.get_AppSettings () [0x00000] in :0 at Mono.WebServer.Apache.Server+ApplicationSettings..ctor () [0x00000] in :0 mod-mono-server4 正在监听:/tmp/mod_mono_server 根目录:/usr/local/bin 错误:已经有一个服务器正在监听 /tmp/mod_mono_server

我搜索了这个错误,发现了这个 bug:

https://bugzilla.xamarin.com/show_bug.cgi?id=7967

也许 mod-mono-server4 的错误是其他 bug 的根源...我将尝试获取 xsp 3.0 并查看是否解决了问题。
有任何想法吗?
谢谢

1
你是怎么安装Mono 3.0的?对我来说,看起来你是从源代码编译的,但配置了错误的前缀。 - konrad.kruczynski
我按照这个指南操作:http://wiki.phonicuk.com/Installing-Mono-in-CentOS-5-x.ashx。我只是将“mono-2.10.8.tar.gz”替换为“mono-3.0.0.tar.bz2”。 - Miguel Marques
你可能需要关注 ./configure --prefix=/usr/local 部分。执行 whereis mono 命令并查看第一个前缀是什么。也许是 /usr?如果是这样,请使用您获得的前缀再次执行该过程。之后运行 mono --version 确认一下。 - konrad.kruczynski
我发现httpd.conf中的MonoServerPath默认值为“/usr/bin/mod-mono-server4”的行被完全忽略了,因为我重命名了文件,而Apache一直在获取mod-mono-server2。我漏掉了“MonoAutoApplication disabled”。添加了这一行后,它开始获取“mod-mono-server4.exe”,但出现了运行时错误,所以我将mod-mono-server4指向/usr/local/src/xsp-2.10.2/src/Mono.WebServer.Apache/mod-mono-server4.exe,错误消失了。 - Miguel Marques
现在我有另一个问题,当我调用服务时,什么也不发生,浏览器永远等待,而Apache错误日志为空。如果我删除“MonoPath /usr/local/lib/mono/4.0”,则在AppHost初始化时会出现System.TypeLoadException,但至少我会得到一些信息。在第一种情况下,我如何知道正在发生什么?谢谢。 - Miguel Marques
1个回答

5
这个错误是由于Mono实现的.NET 4.0框架在Mod_Mono / XSP中使用时,System.Configuration程序集存在问题。它试图读取“MonoServerDefaultIndexFiles” appSetting键,但找不到Create工厂方法。
花了一两天的时间才发现解决方案是编辑以下文件...
/opt/mono/bin/mod-mono-server4
...通过更改此行中默认值为4.5:
exec /opt/mono/bin/mono $MONO_OPTIONS "/opt/mono/lib/mono/4.5/mod-mono-server4.exe" "$@"
解决了这个问题之后,我面临的下一个问题是,Mono通过其设置映射功能将内置的AspNetMembershipProvider替换为SqliteMembershipProvider。我在Web.config的appSettings部分中添加了以下行以禁用此默认行为:
""
经过几天的追踪,我的MVC3应用程序成功运行在Mono 3.0.3(本文撰写时的最新版本)/ XSP 2.10 / Mod_Mono 2.10上。

1
更多信息请访问https://dev59.com/HWnWa4cB1Zd3GeqP38fR - nickvane

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