部署环境:CentOS7+Mono3.10+Jexus5.6Xamarin.Studio中创建的asp.net项目,部署过程很顺利,没有遇到问题;但是对于VS2013中创建的asp.net项目,在部署过程中会有些波折。现在想来,原因是Xamarin.Studio中的项目模板比较简单,只是显示几个字,并没有用到mvc5中的东西。vs2013新建asp.net项目(目标框架为.net4.5),选择mvc,将认证改为不适用认证。编译发布到jexus默认站点指向的目录,并访问。报错信息如下图。根据异常堆栈信息,应该是在调用HtmlHelper的ActionLink方法时,Helper朋友使用了获取RouteCollectionExtention虚拟路径的方法,问题就出在这个方法上。提示应该是RouteCollection缺少AppendTrailingSlash属性(bool,用于控制转换为虚拟路径时是否在末尾加“/”)。实际上,Asp.net路由框架的代码位于System.web.dll中,而System.Web.Routing.dll是一个没有代码的空程序集。RouteCollectionExtention是MVC中路由框架为了方便而对RouteCollection进行的一系列扩展方法。打开mvc的RouteCollectionExtension源码(http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/RouteCollectionExtensions.cs),发现AppendTrailingSlash对RouteCollection的调用。对比.net和mono中的RouteCollection类,发现mono中没有实现属性AppendTrailingSlash,也没有实现属性LowercaseUrls(代码地址分别为.net:http://referencesource.microsoft.com/#System.Web/xsp/system/Web/Routing/RouteCollection.cs#8f054052ef9931ac#references,单声道:https://github.com/mono/mono/blob/master/mcs/class/System.Web.Routing/System.Web.Routing/RouteCollection.cs)。看看mono,++中RouteCollection文件的最后一次更新时间,两年前了,好吧。因为属性不能像扩展方法一样进行扩展,而且路由中没有对RouteCollection的抽象,都是直接被RouteCollection引用,所以暂时解决不了这个问题。谷歌搜索,只有问题,没有答案。我们只能先绕过去,找到View/Share/_Layout.cshtml,把调用Html.ActionLink的代码注释掉,重新发布。这时候可以正常访问,但是页面的样式乱了。在浏览器的开发者工具中可以看到如下404信息。原因肯定是bundle框架不起作用。解决方法是找到bin文件夹,删除Microsoft.Web.Infrastructure.dll,因为mono在lib中有自己对这个程序集的实现。为了开发部署方便,也可以直接设置Microsoft.Web.Infrastructure.dll不在本地复制。再次访问,可以看到清新的Bootstrap界面,但是菜单上的倒霉链接已经被注释掉了。从上面可以看出mono目前对mvc5的兼容性还不够好,可能要等vNext不屑于兼容mvc5了。MVC5在mono上显示几个文本没有问题,但是HtmlHelper的一些方法不能使用,因为它们间接调用了mono没有实现的路由框架的属性。RouteCollectionExtention中获取虚拟路径的方法很重要,也经常用到。为此,我们只能放弃mvc5,降级到mvc4。保级的过程就是一部血泪史,有血有泪有屎。mvc相关的nuget包主要有:MicrosoftAsp.NetMVC、MicrosoftAsp.netWebPages、MicrosoftAsp.netRazor。棘手的是这三个包的不同版本不一定兼容。本来觉得把MVC4直接引入NuGet就好了,但是遇到了各种问题,不是这个包没方法就是那个包没有方法,最后试了很多组合都没有成功。最后只好投机取巧,先创建一个mvc4项目(在vs2013的创建项目框中展开web选择vs2012可以看到mvc4模板),然后自动把mvc4、webPage、razor包放上去由vs创建,复制到原始解决方案的包目录中。依次卸载NuGet中的MVC5、WebPages、Razor,然后在上面复制的三个包中添加对程序集的引用。此时在vs2013中编译运行会遇到如下异常:打开View文件夹下的Web。config,configSections仍然保留着前几个程序集的引用,在mvc4项目中复制这个配置,编译运行,看到如下异常:找不到System.Web.Helpers命名空间,我可以明确引用程序集System.Web.Helpers,但bin中没有System.Web.Helpers.dll。仔细查看,原来是没有设置复制到本地,对应查看上面手动添加的几个引用是否设置为复制到本地,再次编译运行,在windows下可以正常浏览。取消注释上面layout.cshtml中注释掉的调用Html.ActionLink的代码。编译运行,OK;部署到CentOS,删除bin文件夹下的Microsoft.Web.Infrastructure.dll,重启jexus,浏览,正常显示,点击菜单上的几个HtmlHelper生成的链接,完美!!!倒霉的菜单又回来了!!!最终代码在这里。原文来自:http://www.cnblogs.com/FuzhePan/p/4053455.html
