动态WebApi实践

  • 框架名称 SunLight.DynamicWebApi
  • 创建一个普通的WebApi
  • 引入Swagger Api界面(可选)
    • 2.1 为什么要引入?
    • 2.2 如何引入
      • 2.2.1 安装框架
      • 2.2.2 修改SwaggerConfig.cs
      • 2.2.3 创建项目XML注释文档
      • 2.2.4 修改WebApiConfig.cs
      • 2.2.5 测试Swagger
  • 引入SunLight.DynamicWebApi框架
    • 3.1 如何引入
    • 3.2 如何使用
      • 3.2.1 WebApi项目中创建模块
      • 3.3.2 修改Global.asax.cs
      • 3.3.3 新建Application层,即一个动态WebApi
      • 3.3.4 修改WebApi项目Module类
      • 3.3.5 修改WebApiConfig.cs
      • 3.3.6 启动项目,搭建完成

由于项目需求,领导希望剥离服务端的WebApi Controller层的实现,通过反射项目来实现动态的Api,即根据服务端加载的模块,动态的生成Api。忽然想起了Abp框架中已经实现了此功能,在查阅了相关资料后,大胆实现了一个初版的动态WebApi框架,这节不讲原理,我们首先看如何使用这个框架。

框架名称 SunLight.DynamicWebApi

这段只是打个广告,名字来源于Dota英雄卡尔的技能之一,SunLight(天火),希望有兴趣的兄弟一起刮痧对面。

创建一个普通的WebApi

步骤如下:


新创建的WebApi结构如下:

此时,直接运行程序,我们可以在浏览器中看到默认的Api

引入Swagger Api界面(可选)

2.1 为什么要引入?

1.方便后端人员进行Api的测试,方便前端人员来参考调用Api
2.能够根据代码注释自动生成Api接口文档
3.外貌主义,谁不爱美呢?Swagger较之前的WebApiTest等Api测试框架相比,美了十个AMS

2.2 如何引入

2.2.1 安装框架

在解决方案上,右键选择管理NuGet程序包,在打开的界面中搜索Swashbuckle,如下图,然后安装即可。

2.2.2 修改SwaggerConfig.cs

框架安装完成后,找到WebApi项目App_Start目录下生成的SwaggerConfig类

通过修改该类,我们可以修改Api的版本号,标题之类的信息

2.2.3 创建项目XML注释文档

右键项目→属性→生成→选中下方的 “XML文档文件” 然后保存

然后在SwaggerConfig.cs的EnableSwagger中启用配置


c.IncludeXmlComments(System.IO.Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "bin\\DynamicWebApi.xml"));

2.2.4 修改WebApiConfig.cs

在App_Start目录下,修改WebApiConfig.cs文件

 config.Routes.MapHttpRoute(name: "DefaultApi",//修改了这里,在controller和id中间加了actionrouteTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });

2.2.5 测试Swagger

在Controller下添加一个静态的Api,可以Copy我这个进去,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;namespace DynamicWebApi.Controllers
{/// <summary>/// 静态的Api控制器/// </summary>public class StaticController : ApiController{/// <summary>/// 问好方法/// </summary>/// <param name="UserName">名字</param>/// <returns>问好实体</returns>[HttpGet]public ResultEntity SayHello(string UserName){return new ResultEntity(){Code = 400,Msg = string.Format("Hello {0}", UserName)};}/// <summary>/// 问别方法/// </summary>/// <param name="UserName">名字</param>/// <returns>问别实体</returns>[HttpGet]public ResultEntity SayBye(string UserName){return new ResultEntity(){Code = 400,Msg = string.Format("ByeBye {0}", UserName)};}/// <summary>/// 创建一个用来测试Swagger界面返回的实体/// </summary>public class ResultEntity{/// <summary>/// 返回码/// </summary>public int Code { get; set; }/// <summary>/// 返回信息/// </summary>public string Msg { get; set; }}}
}

启动项目,在浏览器地址后面输入Swagger,回车即可看到如下界面,恭喜,成功啦~

引入SunLight.DynamicWebApi框架

3.1 如何引入

目前只能从CSDN上下载类库,直接以添加现有项目的方式添加入解决方案,下载地址
下载地址

3.2 如何使用

3.2.1 WebApi项目中创建模块

在App_Start目录下,创建一个模块,如下:

    /// <summary>/// WebApi层模块类/// </summary>public class WebApiModule : SunLightModule{}

3.3.2 修改Global.asax.cs

修改继承基类为SunLight.Dynamic.DynamicApiApplication,如下:

     /// <summary>/// 注意,此处方法是Override/// </summary>protected override void Application_Start(){//请注意必须调用父类方法base.Application_Start();AreaRegistration.RegisterAllAreas();GlobalConfiguration.Configure(WebApiConfig.Register);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);}

3.3.3 新建Application层,即一个动态WebApi

1.新建一个类库DemoApplicaiton
2.定义一个接口,继承自SunLight.Dynamic.IApplicationService

 /// <summary>/// 英雄相关接口/// </summary>public interface IHeroService : IApplicationService{/// <summary>/// 根据英雄类别获取英雄列表/// </summary>/// <param name="type">英雄类别,0智力,1力量,2敏捷</param>/// <returns></returns>List<HeroOutputDto> GetHeroListByType(int type);/// <summary>/// 根据英雄Id获取英雄/// </summary>/// <param name="Id"></param>/// <returns></returns>HeroOutputDto GetHeroById(int Id);}

3.定义该接口的实现类

 public class HeroService : ApplicatonService, IHeroService{/// <summary>/// 根据英雄Id获取英雄/// </summary>/// <param name="Id"></param>/// <returns></returns>public HeroOutputDto GetHeroById(int Id){var allheros = GetAllHeroList();var wantHero = allheros.Find(m => m.HeroId == Id);return wantHero;}/// <summary>/// 根据英雄类别获取英雄列表/// </summary>/// <param name="type">英雄类别,0智力,1力量,2敏捷</param>/// <returns></returns>public List<HeroOutputDto> GetHeroListByType(int type){if (!Enum.IsDefined(typeof(HeroType), type))return null;HeroType Type = (HeroType)Enum.ToObject(typeof(HeroType), type);var allheros = GetAllHeroList();var wantHeroList = allheros.FindAll(m => m.HeroType == Type);return wantHeroList;}/// <summary>/// 模拟一些数据/// </summary>/// <returns></returns>private List<HeroOutputDto> GetAllHeroList(){List<HeroOutputDto> result = new List<HeroOutputDto>();result.Add(new HeroOutputDto() { HeroId = 0, HeroName = "Kaer", HeroType = HeroType.智力 });result.Add(new HeroOutputDto() { HeroId = 1, HeroName = "蓝胖", HeroType = HeroType.智力 });result.Add(new HeroOutputDto() { HeroId = 2, HeroName = "Lina", HeroType = HeroType.智力 });result.Add(new HeroOutputDto() { HeroId = 3, HeroName = "黑鸟", HeroType = HeroType.智力 });result.Add(new HeroOutputDto() { HeroId = 4, HeroName = "斧王", HeroType = HeroType.力量 });result.Add(new HeroOutputDto() { HeroId = 5, HeroName = "骷髅王", HeroType = HeroType.力量 });result.Add(new HeroOutputDto() { HeroId = 6, HeroName = "伐木机", HeroType = HeroType.力量 });result.Add(new HeroOutputDto() { HeroId = 7, HeroName = "幻影刺客", HeroType = HeroType.敏捷 });result.Add(new HeroOutputDto() { HeroId = 8, HeroName = "剑圣", HeroType = HeroType.敏捷 });result.Add(new HeroOutputDto() { HeroId = 9, HeroName = "小骷髅", HeroType = HeroType.敏捷 });return result;}}

4.创建Appcation层的模块Module并重写init方法,注册service

public class DemoModule : SunLightModule{protected override void Init(){base.Init();//注册DynamicHttpControllerManager.RegisterType<IHeroService, HeroService>();}}

5.创建Applicaiton层项目Xml注释文档并加入Swagger,可参考2.2.3

并在webApi项目的SwaggerConfig中添加此配置文件

c.IncludeXmlComments(System.IO.Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "bin\\DemoApplication.xml"));

3.3.4 修改WebApi项目Module类

在WebApi项目的Module类上添加注解,想要生成几个Applcaiton项目的Api,就依赖几个,如注解内的注释代码

   /// <summary>/// WebApi层模块类/// </summary>[DependsOn(typeof(DemoModule)/*, DependsOn(typeof(Demo2Module)*/)]public class WebApiModule : SunLightModule{}

3.3.5 修改WebApiConfig.cs

在App_Start目录下,添加如下内容

 public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API 配置和服务// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });//添加动态webApu路由config.Routes.MapHttpRoute(name: "DynamicWebApi",routeTemplate: "services/{ServiceName}/{ActionName}");}}

3.3.6 启动项目,搭建完成

启动项目,并在浏览器地址栏输入Swagger后回车,即可看到根据Applicaiton动态生成的Api,还等什么,调用试试,享受下胜利的果实。

ASP .NET之动态WebApi实践相关推荐

  1. ASP.NET Core 奇淫技巧之动态WebApi

    一.前言 接触到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件 ...

  2. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  3. ABP官方文档(三十)【动态WebApi层】

    5.2 ABP表现层 - 动态WebApi层 5.2.1 建立动态WebApi控制器 这是一篇关于ASP.NET Web API的文档.如果你对ASP.NET感兴趣,请阅读ASP.NET Core文档 ...

  4. asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性

    asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false;  // true 因为这样该容器及其子控件会彻底的从页面上消 ...

  5. android 实现表格横向混动_Flutter混合开发和Android动态更新实践

    Flutter混合开发和Android动态更新实践 感谢闲鱼和csdn的文章给的思路: 本篇是实践性文章包含两部分 将Flutter工程编译后的文件集成到Android项目 将Flutter代码热更新 ...

  6. 如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题

    如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题 参考文章: (1)如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题 (2)ht ...

  7. ASP.NET Core MVC/WebAPi如何构建路由?

    前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...

  8. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: <table><tr><th styl ...

  9. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销

    上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...

最新文章

  1. selenium速度_RPA UiPath和Selenium,谁是测试套件?
  2. 【Python教程】两种方法教你拆分含有多种分隔符的字符串
  3. Java Hessian小试(转)
  4. c语言程序设计江宝钏第九章,C语言程序设计 (江宝钏 著) 清华大学出版社 第9章习题答案1...
  5. 一晚啪了5只喵,累到在医院打点滴,这中国喵把英国人看傻了 | 今日最佳
  6. C++调用Python脚本函数
  7. Flash开发iOS应用全攻略(三)——如何使用iOS开发者授权以及如何申请证书
  8. dbeaver一款全能的数据库连接工具dbeaver
  9. WPF 入门教程 TextBox详解
  10. 11个超实用的创意设计思维训练方法
  11. 怎么把计算机光盘盒弹出,怎么在Windows 10中弹出CD托盘
  12. CSDN博客去图片水印
  13. Spring Cloud GateWay-过滤器
  14. Thinkphp6快速入门教程
  15. 图片占位符生成器holder.js的简单使用
  16. 2022-2028年全球与中国近红外照相机行业发展趋势及投资战略分析
  17. 用浏览器查看路由器上mentohust的log。
  18. Python之洗牌游戏
  19. 笑傲江湖ol更新服务器正在维护,笑傲江湖ol更新了什么内容 笑傲江湖ol更新内容一览...
  20. 今日份CSS学习:font的相关属性

热门文章

  1. 【笔试题】嵌入式软件开发:笔试总结
  2. 一文搞懂——软件模拟SPI
  3. 图神经网络GNN(三):基于图神经网络的节点表征学习
  4. ARMv8架构下修改Linux内核并打开kvm硬件虚拟化支持(平台Firefly-rk3568)
  5. 软件入门指南篇:51单片机
  6. FreeCAD 常用技巧
  7. linux安装中文语言命令,Centos使用yum命令安装中文语言包(fonts-chinese.noarch,m17n-db-common-cjk)...
  8. 模拟美萍加密狗--Rockey2虚拟狗(二)
  9. 什么是软件生存生命周期模型?有哪些主要模型?
  10. ucore lab 2