使用Nancy为.Net软件快速增加Web调用

本文最后更新于$day天前,文中所描述的信息可能已发生改变。

一、为什么要这样做

​ 在不同平台、语言之间调用,最方便有效的方法是用Http服务,有例如RPC或者restful api等规范,如果已经在开发了一个WinFrom程序或者.Net程序,想增加一个API接口给其他人调用,或者不想暴露一些算法和密钥,或许使用这个方法是最优解。(当然你可以写成类库或者其他方法)。在Go中可以用Gin,Python可以试试用Flask,易语言可试试用“E2EE互联网服务器套件”

二、Nancy

​ Nancy是一个轻量级的,低代码的框架,用于在.NET Framework/Core和Mono上构建基于HTTP的服务。该框架的目标是尽可能地远离障碍,并为所有交互提供一条超级傻瓜快乐的道路。

​ 相对于自己在.Net框架上使用HttpListener或者HttpServer类,简直是敏捷开发的福音。可以方便为已经完成的.Net软件增加一个对外暴露的接口。

​ Nancy已经不再维护,但是他已经兼容.Net Core也是在Github开源,所以已经关系不大。

三、为WinFrom添加

1、通过Nuget安装

如果是为一个软件增加Http服务器功能,需要同时安装Nancy与Nancy.Hosting.Self

1
2
Install-Package Nancy
Install-Package Nancy.Hosting.Self

2、在你的软件中添加以下代码启动Nancy

1
2
3
4
5
NancyHost nh;

nh = new NancyHost(new Uri("http://127.0.0.1:8080"));
nh.Start();
MessageBox.Show("API服务已开启");

建议把NancyHost放在Class内作为全局变量。这样子已经启动了一个HTTP服务器

3、增加你的API接口

​ 我们需要新建一个类文件(.cs),然后类名字可以任意,然后继承NancyModule即可,并在类构造函数中增加你需要处理的URL接口数据。

1
2
3
4
5
6
7
8
9
10
11
       Get("/getip", _ =>
{
String ip = Request.Query.ip;
if (ip != null)
{
'可以获取Get中的ip参数。
}

return "0";

});

注意,Nancy的主页依旧使用Get[“/getip”]这种方法,2.0已经更改,所以如果按照主页的代码会直接报错。

四、一些后续测试

​ Nancy里面大量使用dynamic这个数据类型,可以避免编译器查找数据,在增加路由时,可以无视任何类,直接随便新建一个类继承便可,启动时也不需要传入该类,不清楚内部实现原理,感觉有点像使用反射。官方示例也大量使用匿名方法和委托,需要继续学习。