Ω
返回上页

2020年1月3日最后修改

源码 https://github.com/mirrortom/MyWebApiCore

简介 实现 模板 部署 示例 差别

简介

使用asp.net core平台的自定义webapi项目实现.用dotnet core 控制台项目改进而来.

原理

webapi程序依然是要解决三个问题.监听,匹配,处理:监听请求,分析请求地址和参数,响应请求的功能.

asp.net core监听请求使用了kestrel服务器,响应请求使用的是"中间件",与经典的asp.net管理事件相似,每个"中件间"就相当于一个处理事件.

自定义了分析地址的"中件间"UrlHandler,它分析url,然后指定具体类和方法.

自定义了异常时返回信息的"中件间"CustomExceptionHandlerOptions(),当处理发生异常时,如何返回信息.

中间件

中间件:"middleware",是处理请求的主要方式,是名为"RequestDelegate"的委托类型.

使用Use(middleware)添加中间件,按添加的顺序执行.

需要一个功能,就做一个中间件.也就是实现一个"RequestDelegate"委托.

实现

主要文件

  • ApiHandler类: 用来写自定义的"中间件".按照定义,"中间件"是一个名为RequestDelegate的委托.
  • 添加UrlHandler静态方法,用来分析URL,并且映射到具体的处理类上.该方法返回一个"RequestDelegate"委托.
  • 添加一个辅助类ApiBase,提供一些便利方法.如取参数,返回结果等
  • [HTTPPOST][HTTPGET][HTTPALL]用于贴在方法上的特性,用于实现一些简单功能,例如区别GET或者POST.不是必要的.
  • kestrel.json: 自带的kestrel web服务器配置文件,配置监听端口和其它选项
  • Program.cs: Main()启动类,用于初始化web主机.含有一系列配置选项.

kestrel配置参考这篇文章

https://www.cnblogs.com/Leo_wl/p/7875833.html

一些约定

上述工作弄好之后,就能添加API了.就是添加一个普通的类,做一些约定后就能被访问到了.

  • 类名以Api结尾
  • 类要继承ApiBase
  • 类的方法上要贴上特性

建立项目

  • 用VS2017建一个.net core的控制台程序.添加几个重要的库:(从nuget程序包)
  • Microsoft.AspNetCore.Server.Kestrel // kestrel服务器
  • Microsoft.Extensions.Configuration.Json // 支持使用配置文件json的方式配置服务器
  • Microsoft.AspNetCore.Diagnostics // 发生错误时通知处理,可以自定义错误.
  • Microsoft.AspNetCore.Cors // 支持跨域
  • Microsoft.AspNetCore.Hosting.WindowsServices // 支持以windows服务方式运行web服务器(只在windows系统,不是必须)
  • 复制文件"ApiHandler","ApiBase","kestrel.json","Program.cs(或者main()方法所在的类)"
  • 加入一个测试类Testapi.cs,添加几个处理请求的方法.具体可以参考MyWebApiCore项目代码.

模板

上面的项目建好后,可以导出为项目模板.以后添加新项目选择模板即可.

部署

  • 可直接使用,由于自带kestrel服务器,所以能独立运行.不用部署到其它web服务器环境内
  • 直接使用时,kestrel服务器监听来自外面的请求.但一般不会这样,因为kestrel服务器运行时,会打开一个命令行黑窗口.如果服务死掉了或者被人关掉了,需要重新打开.
  • 可以做为反向代理.部署到IIS,Apache,nginx这些服务后面.托管asp.net core应用,可以自动重启,没有命令行黑窗口.
  • 在windows平台,也可以托管在windows服务下,asp.net core程序支持以windows服务方式托管运行.只需要做很少的修改,这是种成本较低的部署方式.

以windows服务方式托管运行

  • 添加引用 Microsoft.AspNetCore.Hosting.WindowsServices
  • 将启动语句由.Run()修改为.RunAsService()
  • 使用sc命令建立一个windows服务:(下面MyWebApiServer是服务名字,binPath是程序路径,注意=后面有空格,另外加一个参数s,启动据此判断是从控制台启动还是服务启动.DisplayName是服务显示名字)
  • sc create MyWebApiServer binPath= "dotnet D:\MyWebApi\bin\Debug\netcoreapp2.1/MyWebApi.dll s" DisplayName= MyWebApiServerAspNetCore
  • 如果建立成功了,那么打开services.msc 就能找到这个服务,然后点击启动服务.成功后,可测试调用API.
  • 也能用sc命令启动服务: sc start MyWebApiServer

注意事项:

  • 安装服务时,如果直接将编译目录下的MyWebApi.dll当做服务程序路径,那么当编译项目时,会报错占用文件.这时在编译前需要先停止服务.
  • 执行停止服务命令 sc stop MyWebApiServer

以windows服务方式运行,具体参照这篇文章

https://www.cnblogs.com/guogangj/p/9198031.html

url示例

这个url调用的是demo类的gethtml方法,返回html

/demo/gethtml

这个url调用的是demo1的index方法,api是demo1类的命名空间.这个功能可以将API分类(文件夹)

/api/demo1/index

差别

asp.net core与经典的asp.net的差别比较大了,功能上感觉更先进,处理程序设计上也改进很大

  • 自带服务器kestrel,可以独立部署.除了windows,可部署Linux,真正跨平台.
  • 中间件相当于管道事件,可以自由定义,而不用限制在asp.net的十几个事件点上.
  • 系统自带了丰富的中间件,像跨域之类的.只需要配置一下就跨域了.mvc webapi这些框架也都有,习惯差不多.不过前后端分离的话,这些基本没用了.