Asp.Net自定义webapi框架

最后更新: 2022/2/16 建立: 2019/5/5

(github) https://github.com/mirrortom/MyWebApi

简介 实现 模板 部署 示例 后记

简介

基于asp.net的IHttpHandler对象的webapi实现.用dotnet类库项目改装的webapi项目.

原理

一般要处理http请求的程序,都要有监听请求,分析请求地址和参数,响应请求的功能.

经典的asp.net程序,提供了IHttphandler接口,可以实现自定义的处理程序.在asp.net管道事件中,第7个事件和第11事件的工作分别是,请求处理器工场指定处理类和处理程序响应处理.

实现IHttpHandlerFactory和IHttpHandler,就能自定义这两个事件的处理过程.主要在IHttpHandler,它分析url,然后指定具体类和方法.

至于监听,这里不管.交给iis了.由于是基于.net framework的程序,所以也只考虑在IIS中运行.

实现

主要文件

  • 两个类 AdministerHandlerFactory 和 ApiHandler
  • AdministerHandlerFactory 实现IHttpHandlerFactory接口.还可以加一些处理跨域代码
  • ApiHandler 实现IHttpHandler接口.主要工作是分析url,然后找到对应的类和方法,执行方法就是处理了请求.
  • ApiBase是个辅助类,提供一些便利方法.如取参数,返回结果等.
  • [HTTPPOST][HTTPGET][HTTPALL]用于贴在方法上的特性,用于实现一些简单功能,例如区别GET或者POST.不是必要的.
  • web.config这个是iis下此项目的配置文件,主要是配置一个URL映射关系.关键是添加一个处理程序映射,将上面的AdministerHandler类添加进去.

一些约定

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

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

建立项目

  • vs2017建立c#,framework4.7+,空项目或者类库项目.添加引用:"Microsoft.CSharp","Newtonsoft.Json","System","System.Core","System.Web"
  • 建立core文件夹,将"AdministerHandlerFactory.cs","ApiBase.cs","ApiHandler.cs"复制进来
  • 注意修改复制文件的命名空间.引用"System.Core"添加不上时,可以修改项目的.csproj文件,加入"<Reference Include="System.Core" />"
  • 复制web.config到根目录.找到节点名为"AdministerHandler"的项,修改type值"AdministerHandlerFactory"的命名空间部分,改成当前项目的.
  • 加入一个测试类Testapi.cs,添加几个处理请求的方法.具体可以参考mywebapi项目代码.

模板

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

部署

  • 编译生成类库项目
  • 到IIS新建网站,选.net4.0集成.
  • 将项目编译的dll文件复制到网站根目录下的/bin文件夹下.再将web.config复制到根目录下.
  • 一个精减易用的webapi工具就完成了.

web.config

webconfig需要添加处理程序映射.注意path "*." ,匹配 /user/info 这种不带扩展名的路径

<add name="AdministerHandler" path="*." verb="*" type="命名空间.AdministerHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" />

对于静态文件,不需要走处理管道,使用系统的静态文件处理模块.不必配置

<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read">

默认文档失效

配置了AdministerHandler "*." 映射后,请求没有指定文件名时,不再返回默认文档如index.html.

url示例

这个url调用的是test类的index方法

/test/index

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

/api/testns/index

制作背景

基于asp.net提供的IHttpHandler接口,自定义的一个webapi框架,实现IHttpHandler接口完成处理请求,映射到处理类.较早就做出来了,今天整理了一下,独立成一个项目.

目的在于尽量减少使用和部署复杂度.只需要建一个类库项目,实现两个接口就能支持web请求了.

很早在做这个东西时参考了很多网上的博客,主要是要理解asp.net的管道处理逻辑.这个是在请求到来后,暴露的一系列方法,注册这些方法就能自定义处理过程.

当时做这个东西主要是因为自带的框架如webform,asp.net mvc,web api,虽然便利,但也有很多东西不必要的.为了精减,至少做一个类似一般处理程序的这种东西就行.

https://www.cnblogs.com/fish-li/ 这个博客的帮助最大,讲得最为清晰.

想起最早先使用perl做cgi时,就是处理程序了.总结一下,做一个能处理web请求的程序.要解决三个问题.监听,匹配,处理.

监听的问题交给IIS了.匹配和处理主要是通过IHttpHandler和IHttpHandlerFactory两个接口.这两个接口是asp.net框架提供的.事件顺序大概是第11个事件和第7个事件

匹配主要是分析请求url,将它映射到具体的处理类.实例化这个类并且调用方法就完成处理.这一系列的逻辑仍然是基于asp.net管道事件的.