部署环境:CentOS7 + Mono 3.10 + Jexus 5.6

在Xamarin.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的RouteCollectionExtention源码(http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/RouteCollectionExtensions.cs),发现了对RouteCollection的AppendTrailingSlash调用。

对比下.net和mono中的RouteCollection类,发现mono中没有实现AppendTrailingSlash这个属性,同样也没有LowercaseUrls这个属性(代码地址分别是,.net:http://referencesource.microsoft.com/#System.Web/xsp/system/Web/Routing/RouteCollection.cs#8f054052ef9931ac#references,mono:https://github.com/mono/mono/blob/master/mcs/class/System.Web.Routing/System.Web.Routing/RouteCollection.cs)。

再看一下mono中RouteCollection这个文件的最后更新时间,++,两年前,好吧。

因为属性无法像扩展方法一样扩展,而且路由中又没有针对RouteCollection进行抽象,都是直接引用的RouteCollection,这个问题我暂时没招了。翻遍了google,只有问题,没有答案。

只能先绕过去了,找到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包主要有:Microsoft Asp.Net MVC、Microsoft Asp.net Web Pages 、Microsoft Asp.net Razor,比较坑爹的是这三个包的不同版本之间不一定兼容。本来想是直接在NuGet中引入MVC4就好,但是遇到了各种问题,不是这个包少个方法就是那个包少个方法,最终试了很多种组合也没有成功。

最后不得已才用了一个投机取巧的方法,先创建一个mvc4的项目(在vs2013中的创建项目框中展开web选中vs2012就可以看到mvc4的模板),然后把vs自动创建的mvc4、webPage、razor包,复制到原解决方案的package目录下。

在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生成的几个连接,Perfect!!! 倒霉的菜单又回来了!!!

最终的代码在这里

VS2013中的MVC5模板部署到mono上的艰辛历程的更多相关文章

  1. MVC5模板部署到mono

    VS2013中的MVC5模板部署到mono上的艰辛历程 2014-10-27 09:30 by FuzhePan, 3954 阅读, 46 评论, 收藏, 编辑 部署环境:CentOS7 + Mono ...

  2. React开发中react-route-dom使用BrowserRouter部署到服务器上刷新时报404的问题

    React项目部署中遇到的问题 react开发中react-route使用BrowserRoute路径在iis服务器上刷新时报404的问题 解决:在发布的项目根目录添加web.config配置文件 在 ...

  3. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  4. mono上部署web程序初体验

    早就想体验一下mono,但一直琐事缠身.难得有时间,便在网上一通狂搜mono相关的资料. 如果想使用Apache服务器,只能使用mod_mono的方式,这里有详细的介绍.这种方式有点繁琐,需要安装一大 ...

  5. vmware vSphere client中,选择文件->部署OVF模板,报错处理方法

    在vmware vSphere client中,选择文件->部署OVF模板,选择指定的OVA文件,按步骤进行,则会出现这样的错误:此OVF软件包使用了不受支持的功能.OVF软件包需要不支持的硬件 ...

  6. 在VS2013中使用水晶报表

    又遇到了在B/S系统中打印,打印格式要求比较高,打印出的效果要求高大上.用VS2013中微软自带的报表,实在难以实现应用的效果,主要问题表现在: 1.不能插入用Word做好的打印模板,自己按照模板来做 ...

  7. .net程序部署(mono方式)

    某一次 我同事用了这个词 ,说这样才显得够专业 擦.把某某项目 部署到服务器上 .擦 不就是拷个文件过去运行么.月亮 还是绵羊  我搞不清楚了 咱英文不好,绵羊叫的声音?.你就叫我山寨程序猿 随意 一 ...

  8. 如何在VS2013中进行Boost单元测试

    对于如何在VS2013中进行Boost单元测试,这方面资料太少.自己也因此走了不少弯路.下文将会阐述一下如何在VS2013中进行Boost单元测试. 在开始Boost单元测试之前,我们需要先安装VS2 ...

  9. Ansible_使用jinja2模板部署自定义文件

    一.jinja2简介 1.jinja2模板 1️⃣:Ansible将jinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量 2️⃣:变量和逻辑表达式置于标 ...

随机推荐

  1. 一个免费的、跨平台的、开源音频编辑器Audacity

    Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...

  2. 一步一步使用ABP框架搭建正式项目系列教程

    研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...

  3. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  4. C语言 · 最大值与最小值计算

    输入11个整数,计算它们的最大值和最小值. 样例输入 0 1 2 3 4 5 6 7 8 9 10 样例输出 10 0   #include<stdio.h> int main(){ ]; ...

  5. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  6. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  7. gitHub使用入门和github for windows的安装教程

    在看这篇教程之前我想大家也在搜索怎样使用gitHub托管自己的项目,在使用gitHub之前我也遇到过各种问题,在网上我也搜索了很多,但总觉得网上搜索到的东西很多很杂,有的根本不知道是在表达什么.在这过 ...

  8. PHP-----文件系统的交互

    本文讲解php中于文件交互中所使用的函数 代码示例 <html> <head> <title> File Detail </title> </he ...

  9. Velocity笔记--使用Velocity获取动态Web项目名的问题

    以前使用jsp开发的时候,可以通过request很轻松的获取到根项目名,现在换到使用velocity渲染视图,因为已经不依赖servlet,request等一些类的环境,而Web项目的根项目名又不是写 ...

  10. js学习之变量、作用域和内存问题

    js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...