本文是继《NancyFx 系列之 Hello World》之后的第二篇,如果你还没听说过 Nancy,可以先看看那篇我 4 月份就写好的文章,了解一下 Nancy 大概是个怎样的东东。
前文中,写过了如下一个 Hello world 的代码。
public class HomeModule : Nancy.NancyModule
{
public HomeModule()
{
Get["/"] = x => "Hello World!";
}
}
清新明了,一看就明白,http 请求方式是 GET,相对地址是 /
,响应结果是 Hello world
。但是,这个代码要怎么跑起来呢?我们前面提到过 Nancy 跟 ASP.NET MVC 有一些类似,都是一个 Web 服务端的东东。既然是服务端代码,那就得有个 Host 啊,不然是没法运行的。
正如我在前文中提到的,Nancy 具备极佳的可扩展性,灵活度非常高。同样,Nancy 的 Host 也是极其灵活和丰富的。如果你读过 Nancy 官方 Wiki 的话,可能已经了解到 Nancy 支持如下多种 Host 方式:
- ASP.NET Hosting
- WCF Hosting
- Azure Hosting
- Suave.IO Hosting
- OWIN Hosting
- Umbraco Hosting
- Nginx Hosting
- FastCgi Hosting
- Self Hosing
- ……
建议先从 Self Hosting Nancy 开始
按照一贯的风格,我还是先从相对简单且容易理解的方式开始吧。上面哪个方式简单又容易理解呢?Self Hosting!有些人,尤其是习惯了 ASP.NET 的开发者,可能会选择 ASP.NET Hosting。作为从最早的 Beta 版就开始玩 ASP.NET 的我来说,刚学 Nancy 的东西时,也想用 ASP.NET Hosting,因为貌似这个更熟悉一些。但是,我上篇文章中提到过,Nancy 本身跟 ASP.NET 没有直接的关联关系,它的 Context 跟 ASP.NET 的 Context 没有 1 毛钱关系,因为 Nancy 完全不依赖于 System.Web 这个命名空间下的东西。所以如果上去就先选 ASP.NET Hosting 的话,很可能会让你徒增烦恼。
Self Hosting 顾名思义,就是自己 Host 自己。也就是不需要依赖别的应用,而让应用本身就是服务。一个 Console 程序或者一个 Winform 程序都是一个应用,Self Hosting 就是将 Nancy 服务 Host 在这个应用自身中。是不是有点酷呢?你有没有想到一些应用场景(如 OA 之类),如果能这样就好了呢?
通常程序员学习一门语言时先都是用 Console 输出一个 Hello World,那么今天我们就以 Console Project 开始吧:
首先,我们使用 Visual Studio 或者Visual Studio Code 或者 Xamarin Studio创建一个新的 Console 项目。
然后在项目中,用 Nuget 包管理之类的工具,将 Nancy.Hosting.Self 包添加到刚才建立的 Console 项目中。
在刚建好 Console 项目中的入口类 Main.cs 中,创建一个 NancyHost 实例,并调用 Start 方法,启动 Nancy 的 Web 服务。
SelfHost 的启动代码如下:
using (var host = new NancyHost(new Uri("http://localhost:1234")))
{
host.Start()
Console.ReadLine();
}
然后,在该项目添加一个 HomeModule.cs 文件,将前面那段 Hello world 代码替换默认生成的 HomeModule 类。
OK,恭喜你。你的 Self Hosting Nancy 已经初步写完了。让我们按一下 F5,跑起来看看……
呃~你说你的运行不了,嗯。忘了提示你:在 Windows 上你需要用管理员权限运行你的 Visual Studio,然后才能调试运行。否则,你只能先编译好,然后找到编译出来的 exe 文件,以管理员身份运行该程序,才能看到效果。
怎么才能看到上面代码的运行效果,也就是看到你的 "Hello Word" 输出呢?打开浏览器,在地址栏输入 http://localhost:1234/
,然后回车。看到结果了吧?_
可能你会想,为什么 HomeModule.cs,没有在任何地方被显式引用或者调用,就能运行呢?其实这是因为 Nancy 的 Module 于 ASP.NET MVC 中的 Controller 一样,是可以被自发现的。关于 Module 的详情,我们下篇详细言表。