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

时间:2012-11-27 17:08:54

标签: apache mono servicestack mod-mono

我在Apache中使用mod-mono托管ServiceStack Web服务,我有mono-3.0.0和xsp-2.10.2。 我主持了针对.Net framework 2.0并使用mod-mono-server2的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     at(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]中:0     在System.Web.Compilation.BuildManager.CallPreStartMethods()[0x00000]中:0

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

  

gacutil -l System.Web.Extensions

     

以下程序集已安装到GAC中:   System.Web.Extensions,Version = 1.0.61025.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35   System.Web.Extensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35    System.Web.Extensions,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35   项数= 3

即使我将MonoPath设置为专门获取4.0版本,也会发生同样的错误:

  

MonoPath /usr/local/lib/mono/4.0

我也注意到了这一点:

  

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

Mono Runtime版本说2.10.5虽然我安装了mono-3.0.0,但我不知道这些信息是否对此问题有价值。

我尝试直接运行mod-mono-server4并收到此错误消息:

  

MOD-单 - 服务器4

     

MOD-单 - 服务器4   程序集/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'。     在System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(System.String configKey)[0x00000] in:0     在System.Configuration.ConfigurationManager.GetSection(System.String sectionName)[0x00000] in:0     在System.Configuration.ConfigurationManager.get_AppSettings()[0x00000]中:0     在Mono.WebServer.Apache.Server.get_AppSettings()[0x00000]中:0     在Mono.WebServer.Apache.Server + ApplicationSettings..ctor()[0x00000]中:0   MOD-单服务器4   听:/ tmp / mod_mono_server   根目录:/ usr / local / bin   错误:已经有服务器正在侦听/ tmp / mod_mono_server

我用Google搜索了这个错误,它引导我犯了这个错误:

  

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

也许mod-mono-server4上的错误是另一个错误的起源...我将尝试获取xsp 3.0并查看它是否解决了问题。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:5)

此错误是由于Mod_Mono / XSP使用Mono执行 .NET 4.0框架时System.Configuration程序集中的问题引起的。它试图读取“ MonoServerDefaultIndexFiles ”appSetting键,但找不到创建工厂方法。

花了一两天的时间才发现解决方案是编辑以下文件......

  

/选择/单声道/ bin中/ MOD-单服务器4

...在此行中将 4.0 的默认值更改为 4.5

  

exec / opt / mono / bin / mono $ MONO_OPTIONS   “/opt/mono/lib/mono/4.5/mod-mono-server4.exe”“$ @”

解决这个问题后,我面临的下一个问题是,Mono通过其设置地图功能用SqliteMembershipProvider替换了内置的AspNetMembershipProvider。我在Web.config的appSettings部分添加了以下行来禁用此默认行为:

  

“< add key =”MonoAspnetInhibitSettingsMap“value =”disabled“/>”

经过几天的追逐,我的MVC3应用程序在Mono 3.0.3上成功运行(撰写本文时最新版)/ XSP 2.10 / Mod_Mono 2.10