惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
宝玉的分享
宝玉的分享
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
月光博客
月光博客
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
雷峰网
雷峰网
博客园 - 叶小钗
量子位
IT之家
IT之家

博客园 - 阿不

10年总结,得到与失去 Windows phone7 软件发布:理财计算器(包括wp7房贷计算器,wp7个税计算器,wp7存款利息计算器) 从.NET到Mono-记Kooboo CMS对Mono的兼容历程:三、平台的兼容性 从.NET到Mono-记Kooboo CMS对Mono的兼容历程:二、大小写敏感问题,到处都是地雷 从.NET到Mono-记Kooboo CMS对Mono的兼容历程:一、Mono以及移平台的基本注意要点 ASP.NET MVC3 on Mono的折腾(二):Linux(openSUSE)下的部署 迟到的2010总结 周末随想之移动随笔 NVelocity for ASP.NET MVC ASP.NET 4.0在IIS6原生支持没有后缀名的URL请求 闲语MVC3和Razor ASP.NET MVC3 RC2和一些小bug ASP.NET MVC 的统一异常处理有多难?(衍生的意图,出错后如何保持表单的状态?) DataAnnotation脱离MVC独立验证 Attribute与TypeDescriptor的故事 DataContext是否可以静态化? 今日手记:ASP.NET进程内的定时任务 有趣的同名不同约束泛型扩展方法的编译问题 在程序中动态执行T4模板,如何传参数给T4模板?
ASP.NET MVC3 on Mono的折腾(一):Windows下的部署
阿不 · 2011-02-20 · via 博客园 - 阿不

Mono 2.10支持MVC3和Razor的消息着实让我兴奋了好一会儿,因为支持MVC3后,我就有可能做Kooboo CMS3兼容Mono的相关测试工作。可是没一会儿,我就发现,离我的目标还是有一点距离。不晓得是Mono 2.10本身存在的bug,还是我的原因,我总是无法很完美的在Mono运行起MVC3的站点,即使是用默认的MVC3站点模板创建的非常简单的站点也是一样。长期生活在微软Windows/.NET平台的滋润环境中,没有Linux平台的使用经验和基于配置文件的Web部署习惯,让我花了不少的时间来解决原本很简单的问题的。从使用XSP失败,到折腾Windows下使用Nginx+FastCGI来Host ASP.NET MVC3站点,之后再花了半个周末如痴如醉的研究openSUSE下的Mono部署。虽然没有解决MVC3的运行问题,但是总算还是搞清楚了如何在Mono部署ASP.NET站点,以及简单的linux平台(openSUSE)操作。下面就简单的记录一下这些艰难历程:

环境准备

在VS2010,用默认的MVC3站点模板创建一个简单MVC站点,有简单的首页和登录页面,并且在Bin下面要私有部署MVC3的相关依赖程序集除了Microsoft.Web.Infrastructure.dll。站点下载

1.使用Mono 2.10的XSP服务器失败

Mono支持跨平台,当然包括Windows平台,而且在Windows平台下面,它也提供了一种非常简单的方式来让我们方便的通过Mono启动Web站点,就这是XSP。在Mono安装成功之后,它会在目录的右键菜单中增加一个菜单项“XSP 2 Web Server Here 2.10”,而我们只需要简单的选择这个菜单项就可以将目录作为Web站点用Mono运行起来。而这里的XSP2,表示,我们使用的是ASP.NET 2.0,如果你需要用ASP.NET 4.0,那你可以通过修改注册表的方式再增加一个类似的菜单项,只是把执行的批处理由xsp2.bat改为xsp4.bat就行了。这原本是最为简单的测试方案,而且我使用Mono2.8来启动MVC2站点也是没有任何问题。结果在Mono 2.10中,XSP的站点死活就是不响应,那个请求让他运行一万年,它也是在那边loading,也不timeout。问题通过各种努力,最终无力解决。

2.在Windows平台下使用Nginx+FastCGI-mono-server架起MVC3站点,但是表单提交后,ModelBinder无法正常绑定Action Model.

XSP行不通,只能想其它办法。在尝试了在Windows使用Apache失败之后,选择了Nginx+FastCGI来架构ASP.NET站点。在园子里面找到这篇介绍在Mono架设ASP.NET站点,不过根据这篇文章我始终没有搞明白具体如何配置,好像很复杂的样子,还要下载它提供的文件,尝试无果。幸好在Mono的官方站点找到Nginx的Mono配置文件,不过是Linux下面的配置。没关系,看那配置也就那几个步骤,应该很简单。期间也遇到过一些问题,不过都顺利解决,下面简单记录一下Nginx+Mono在Windows下部署ASP.NET站点的步骤:

1)从Nginx 的官方网站下载最新的Nginx软件,纯绿色,无需安装。下载之后,解压到某一目录,这里是:E:\Mono\nginx-0.9.4

2)为了方便,把你的ASP.NET站点,也拷到Nginx目录下面,我这边使用的目录名称是:Mono_MVC3

3)进入conf目录下,找到nginx.conf,找到location /{},我们把这段配置改为我们自己的值:

location / {
         root Mono_MVC3; #如果是其它绝对路径要用:E:/a/b/c
         
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
         include fastcgi_params;
 }

原本应该是还有一行fastcgi_index Default.aspx,用来设置默认页面; 但因为我这里是Host MVC站点,所以去掉这行配置。如果没有去掉这行,站点的根目录将会无法访问。

4)部署MVC站点,除了去掉默认首页设置之外,还需要在conf目录下找到fastcgi_params这个文件,在文件最后加上下面两行配置:

fastcgi_param  PATH_INFO          "";
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

5)需要配置的部分都已经结束。下面就可以Mono FastCGI Server,这个命令行稍有差错,就会让我们的站点无法站点,结合了各方资料,我自己可以正常工作的命令行是:

D:\Program Files\Mono-2.10\bin>fastcgi-mono-server4 /socket=tcp:127.0.0.1:9000 /root="E:\Mono\nginx-0.9.4\Mono_MVC3" /applications=/:. /multiplex=True /port=8080

6)最后一步,运行:nginx.exe。注意,只需要双击运行就可以了,双击就会在后台执行,不用在命令行下面运行。

以上就是Nginx+Mono在Windows下面最详细的配置步骤了。正常情况下,这时候我们只要访问Http://localhost:8080,站点应该就可以正常工作了。但是,因为Mono 2.10和MVC3,我还是遇到问题了:

1)每次FastCGI-Mono-Server第一次解析站点,都会出错,只要你刷新一下页面就可以正常访问了。

Nginx-exception

2)当我们重定向到登录页,输入用户名密码之后提交,又会遇到另外一个问题,Action无法被执行:

Nginx-exception2

其实,在我最开始的尝试中(另一台机器),是不会抛出异常的,提交过程正常,但是会提示你没有输入用户名/密码,也就是LogOnModel的属性没有通过ModelBinder正确绑定。我目前也搞不清楚是不是在官方的下载中,提供了不同的编译版本。

在Windows下的部署,总算是有一个可以成功了,可是仍然还是存在运行不正确的问题。于是把目光投到Linux下面,看看Linux下面的部署会不会正确 ,毕竟Mono的主要部署场景还是在非Windows平台下。

后续:ASP.NET MVC3 on Mono的折腾(二):Linux(openSUSE)下的部署