Razor视图引擎适用于Mono吗?

49

我尝试搜索了一下,但没有找到答案。Razor视图引擎在Mono中工作吗?


对于这个问题,有什么建议? - Zameer Ansari
5个回答

60
是的,它可以在Linux上使用mono实现。您需要从以下稳定源获取mono 2.10.2+:
http://ftp.novell.com/pub/mono/sources-stable/
http://download.mono-project.com/sources/mono/
然后,您需要将这些程序集复制到应用程序的bin目录中(您可以从Windows上的Visual Studio中获取):
System.Web.Mvc.dll
System.Web.Razor.dll
System.Web.WebPages.dll
System.Web.WebPages.Deployment.dll
System.Web.WebPages.Razor.dll
接下来,您可能需要消除您可能遇到的以下错误:

错误:在执行_AppStart时无法创建存储范围。
原因:Microsoft.Web.Infrastructure.dll被本地复制到bin目录中。
解决方案:删除Microsoft.Web.Infrastructure.dll并使用mono版本

错误:System.Web.Handlers.ScriptModule:.ctor()中的无效IL代码:方法体为空。
原因:System.Web.Extensions.dll以某种方式被本地复制到bin目录中。
解决方案:删除System.Web.Extensions.dll并使用mono版本


错误:无法加载模块中的类。描述:HTTP 500.请求处理出错。
原因:System.Web.WebPages.Administration.dll被本地复制到bin目录中。
解决方案:删除System.Web.WebPages.Administration.dll并取消引用它


错误:无法加载类型
'System.Web.WebPages.Razor.RazorBuildProvider'来自程序集 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'。描述:HTTP 500. 请求处理出错。
原因:System.Web.Razor.dll损坏或丢失(或x64代替x32或反之)...
解决方案:获取一个未损坏的System.Web.Razor.dll版本并将其本地复制到bin目录中。

编辑
从mono 2.12 / MonoDevelop 2.8开始,所有这些都不再需要。

请注意,在2.10(Ubuntu 11.10)上,还需要本地复制System.Web.DynamicData.dll,否则您会在App_Start时出现错误(如果不这样做,您将在第一次调用页面时得到YSOD,但仅限于第一次,因为只有在此时才会调用App_Start)。
对于带有ASP.NET MVC4的mono 3.0+:安装脚本中存在“错误”或者说是不完整性。
mod-mono、fastcgi-mono-server4和xsp4将无法正常工作。例如:fastcgi-mono-server4会给您提供以下调试输出:
[error] 3384#0: *101 upstream sent unexpected FastCGI record: 3 while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost:8000"

这是因为安装了mono3之后,它使用的是4.5框架,但是xsp、fastcgi-mono-server4和mod-mono不在4.5 GAC中,只有4.0 gac中存在。
为了解决这个问题,请使用以下bash脚本:

#!/bin/bash

# Your mono directory
#PREFIX=/usr
PREFIX=/opt/mono/3.0.3


FILES=('mod-mono-server4'
       'fastcgi-mono-server4'
       'xsp4')

cd $PREFIX/lib/mono/4.0

for file in "${FILES[@]}"
do
   cp "$file.exe" ../4.5
done


cd $PREFIX/bin

for file in "${FILES[@]}"
do
  sed -ie 's|mono/4.0|mono/4.5|g' $file
done

如果您通过FastCGI(例如nginx)使用它,您还需要针对chuncked_encoding bug修复TransmitFile
(在mono 3.2.3中已经修复),为什么我的图片开头有多余的字节?

PS:
您可以从这里获取3.x的.deb文件:
https://www.meebey.net/posts/mono_3.0_preview_debian_ubuntu_packages/ 或者从github上编译自己的软件包 在Ubuntu / Debian中安装Mono 3.x 或者像这样从稳定源中获取 http://ubuntuforums.org/showthread.php?t=1591370

2015

现在您可以使用Xamarin提供的软件包

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update

如果您需要最新的功能,您也可以获取CI包(夜间构建,可以这么说),如果您需要最新(或几乎最新)版本。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://jenkins.mono-project.com/repo/debian sid main" | sudo tee /etc/apt/sources.list.d/mono-jenkins.list
sudo apt-get update

1
你是冠军 - 我一直在为存储范围的错误而奋斗,找到了这个并解决了它。谢谢。 - Michael Shimmins
3
快速说明一下,MVC 3已经添加到了Mono中(参见https://github.com/mono/mono/commit/3f4e22a0ce7206b9321991123893a63b2dd398d4),因此在Mono 2.12及更高版本中就不需要执行上述所有步骤了。 - Justin
@Brad:没错,Microsoft.Web.Infrastructure.dll仍需要使用mono版本。我也遇到过这个问题。看起来Justin的评论并不完全准确。如果你的fasctcgi是2.10而不是3.0.6,我不确定是否会有问题,我没有遇到任何问题,但我倾向于同意。否则,你可以获取xsp等内容,并将它们编译为.NET 4.5,然后将这些可执行文件放入该文件夹中。 - Stefan Steiger
有关于这个问题的任何建议吗?(链接:https://dev59.com/KYvda4cB1Zd3GeqPYFg2) - Zameer Ansari
1
@xameeramir:使用最新的Mono版本应该可以解决您在MVC 5方面遇到的问题。如果Xamarin包不够新,请使用CI包。 - Stefan Steiger
显示剩余6条评论


3

我猜你需要等待MVC3的发布(并成为开源)才能得到完美的答案。

不过我相信Mono团队会让它运行起来的。


3
自Mono 2.10起,完全支持MVC3和Razor,尽管目前Mono项目无法像包含MVC1和MVC2那样(通过开源实现)随附一个MVC3 / Razor堆栈的开源实现。从发布说明中可以看出:虽然ASP.NET MVC3是开源的,并且在MS-PL许可下授权,但它需要一些新库的依赖项,这些库不是开源的,也不是Microsoft.NET Framework的一部分。目前我们没有这些库的开源实现,因此我们无法将完整的ASP.NET MVC3堆栈与Mono一起提供(我们仍然将ASP.NET MVC 1和MVC 2与Mono一起提供)。但是,此Mono版本具有足够的错误修复程序和补丁,您将能够使用它运行ASP.NET MVC3站点。

1

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