ASP .NET之动态WebApi实践
动态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实践相关推荐
- ASP.NET Core 奇淫技巧之动态WebApi
一.前言 接触到动态WebApi(Dynamic Web API)这个词的已有几年,是从ABP框架里面接触到的,当时便对ABP的这个技术很好奇,后面分析了一波,也尝试过从ABP剥离一个出来作为独立组件 ...
- 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析
动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...
- ABP官方文档(三十)【动态WebApi层】
5.2 ABP表现层 - 动态WebApi层 5.2.1 建立动态WebApi控制器 这是一篇关于ASP.NET Web API的文档.如果你对ASP.NET感兴趣,请阅读ASP.NET Core文档 ...
- asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性
asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性 就是不用 XXX.Visible = false; // true 因为这样该容器及其子控件会彻底的从页面上消 ...
- android 实现表格横向混动_Flutter混合开发和Android动态更新实践
Flutter混合开发和Android动态更新实践 感谢闲鱼和csdn的文章给的思路: 本篇是实践性文章包含两部分 将Flutter工程编译后的文件集成到Android项目 将Flutter代码热更新 ...
- 如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题
如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题 参考文章: (1)如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题 (2)ht ...
- ASP.NET Core MVC/WebAPi如何构建路由?
前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...
- ASP.NET MVC动态加载数据
ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: <table><tr><th styl ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...
最新文章
- selenium速度_RPA UiPath和Selenium,谁是测试套件?
- 【Python教程】两种方法教你拆分含有多种分隔符的字符串
- Java Hessian小试(转)
- c语言程序设计江宝钏第九章,C语言程序设计 (江宝钏 著) 清华大学出版社 第9章习题答案1...
- 一晚啪了5只喵,累到在医院打点滴,这中国喵把英国人看傻了 | 今日最佳
- C++调用Python脚本函数
- Flash开发iOS应用全攻略(三)——如何使用iOS开发者授权以及如何申请证书
- dbeaver一款全能的数据库连接工具dbeaver
- WPF 入门教程 TextBox详解
- 11个超实用的创意设计思维训练方法
- 怎么把计算机光盘盒弹出,怎么在Windows 10中弹出CD托盘
- CSDN博客去图片水印
- Spring Cloud GateWay-过滤器
- Thinkphp6快速入门教程
- 图片占位符生成器holder.js的简单使用
- 2022-2028年全球与中国近红外照相机行业发展趋势及投资战略分析
- 用浏览器查看路由器上mentohust的log。
- Python之洗牌游戏
- 笑傲江湖ol更新服务器正在维护,笑傲江湖ol更新了什么内容 笑傲江湖ol更新内容一览...
- 今日份CSS学习:font的相关属性
热门文章
- 【笔试题】嵌入式软件开发:笔试总结
- 一文搞懂——软件模拟SPI
- 图神经网络GNN(三):基于图神经网络的节点表征学习
- ARMv8架构下修改Linux内核并打开kvm硬件虚拟化支持(平台Firefly-rk3568)
- 软件入门指南篇:51单片机
- FreeCAD 常用技巧
- linux安装中文语言命令,Centos使用yum命令安装中文语言包(fonts-chinese.noarch,m17n-db-common-cjk)...
- 模拟美萍加密狗--Rockey2虚拟狗(二)
- 什么是软件生存生命周期模型?有哪些主要模型?
- ucore lab 2