使用Mono 3.2.0运行.NET MVC 4

5
我正在尝试配置Mono 3.0以在.NET 4和.NET 4.5下运行MVC4网站。我一直在解决各种错误,有什么方法可以让它正常运行? 服务器配置
  • CentOS 5
  • Apache 2.2.3
  • 3.2.0 (tarball Sun Jul 28 00:57:40 UTC 2013); ASP.NET Version: 4.0.30319.17020 2013)
  • 最新的XSP git版本,在发布此文章时
Apache/Mono配置
MonoServerPath "/usr/local/bin/mod-mono-server4"

/usr/local/bin/mod-mono-server4 的内容:

#!/bin/sh
exec /usr/local/bin/mono $MONO_OPTIONS "/usr/local/lib/mono/4.5/mod-mono-server4.exe" "$@"

更新

问题的症结在于Mono不附带MVC4,而该网站需要它。它仍然有MVC3 dlls,但它有Razor 2 dlls而没有Razor 1 dlls,而MVC3需要使用Razor 1 dlls。


也许这可以帮助到你:http://blog.miraclespain.com/archive/2013/Jun-24.html,你可以从中获取大部分 NuGet 缺少的引用,而不是使用 Mono 从头开始构建所有内容。 - jakobandersen
谢谢提供链接。MVC3应用程序实际上运行良好 - MVC3现在已经整合到了Mono代码库中。 - Brian
我认为你遇到的NullReferenceException与Mono中的MVC4无关,我认为你的mono安装有问题(因为你使用了/usr/local前缀),所以我会给你的问题和答案投反对票。 - knocte
参见此示例:http://stackoverflow.com/questions/17874626/servicestack-openid-authproviders-on-mono/17909771#17909771 - knocte
@knocte 我在Cent OS 6.6的全新安装中,使用Git上最新的XSP和MOD_MONO源代码以及7/24的3.2.0 tarball进行了复现。在Cent OS上,/usr/local似乎是默认的安装位置。您目前能够在Mono下运行.NET MVC4吗? - Brian
@knocte 我在更新帖子的顶部时有点匆忙。实际上有两个不同的问题,第一个已经解决,第二个似乎与我下面的结论有关。首先,System.Web.Mvc使用UnvalidatedRequestValuesBase,但我在Mono源代码中找不到它的任何信息。也许我漏掉了什么,但我在源代码中找不到它,或者无法使MVC4构建针对Git中当前版本的内容。 - Brian
2个回答

5
现在Mono框架和NuGet都提供了所需内容。我为.NET 4.0和.NET 4.5创建了MVC4的可下载模板,并提供了一些解决问题的注释:http://www.cafe-encounter.net/p1510/asp-net-mvc4-net-framework-version-4-5-c-razor-template-for-mono-on-mac-and-linux
博客文章中的步骤如下: - git clone github.com/chrisfcarroll/AspNetTemplatesForMono/Mvc4CSharpRazorFx45Intranet,注意:这个Github仓库包含了所有必需的dll文件,如果你无法使用NuGet,那么它会是一个超大的下载。 - 在Xamarin Studio中打开解决方案,这个解决方案几乎可以直接使用。你需要做的唯一一件事就是选择其中一项,以使其正常工作: - 从bin\目录和项目中删除Microsoft.Web.Infrastructure.dll - 或者,在命令行上执行:
sudo mkdir /Library/Frameworks/Mono.framework/Versions/3.2.5/etc/mono/registry
sudo chmod g+rwx /Library/Frameworks/Mono.framework/Versions/3.2.5/etc/mono/registry

(将3.2.5替换为您的Mono版本,可以使用命令行mono --version获得);

在Windows上的.Net需要Microsoft.Web.Infrastructure.dll,因此如果您想要实现跨平台部署,则删除它并不是最简单的方法。


1

成功

如果您想在Mono上运行MVC4,则需要使用一些Microsoft dlls,这些dlls目前由Mono不提供。

警告:粗略查看Mono源代码,MC4源代码中似乎存在一些方法和类,在3.2.0版本中不存在。可能会有某些功能出现故障。我正在运行的网站实际上是针对最新dll构建的MVC3站点。

要复制的Microsoft DLLs

  • System.Web.Abstractions - 4.0
  • System.Web.Helpers - 2.0
  • System.Web.Mvc - 4.0

一旦您复制了dlls,如果仍然遇到问题,则可能需要进行一些侦探工作,如果上述修复方法无效。如果您收到错误消息,指示Mono找不到DLL,则通常有三个原因:

故障排除

  1. 它没有这个dll文件 - 您可以尝试使用Microsoft版本的DLL

  2. 当正确的DLL已安装在GAC或项目文件夹中时,它正在寻找旧版本的DLL - 您的项目中的某个程序集可能在某处引用了该版本。您可以使用绑定重定向来强制使用您拥有的特定版本。

  3. 它仍然找不到dll文件 - 在web.config的编译/程序集部分中添加该程序集

  4. 您收到“无法找到搜索的视图...”消息 - 如果该特定视图文件夹中的任何视图存在编译错误,则会收到此消息。


1
请注意,在我的Ubuntu 16.04服务器上,对于“无法找到搜索的视图...”消息,我发现它是由于Microsoft.Web.WebPages.OAuth.dll位于bin目录中所致。不知道为什么会导致这个错误,但在删除该dll并将VS 2010复制本地设置为false后,该网站立即开始像冠军一样工作,即使使用简单成员资格和MySQL而不是ms sql。 - Jacqueline Loriault

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