这段只是打个广告,名字来源于Dota英雄卡尔的技能之一,SunLight(天火),希望有兴趣的兄弟一起刮痧对面。
新创建的WebApi结构如下:
此时,直接运行程序,我们可以在浏览器中看到默认的Api
1.方便后端人员进行Api的测试,方便前端人员来参考调用Api
2.能够根据代码注释自动生成Api接口文档
3.外貌主义,谁不爱美呢?Swagger较之前的WebApiTest等Api测试框架相比,美了十个AMS
在解决方案上,右键选择管理NuGet程序包,在打开的界面中搜索Swashbuckle,如下图,然后安装即可。
框架安装完成后,找到WebApi项目App_Start目录下生成的SwaggerConfig类
通过修改该类,我们可以修改Api的版本号,标题之类的信息
右键项目→属性→生成→选中下方的 “XML文档文件” 然后保存
然后在SwaggerConfig.cs的EnableSwagger中启用配置
c.IncludeXmlComments(System.IO.Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "bin\\DynamicWebApi.xml"));
在App_Start目录下,修改WebApiConfig.cs文件
config.Routes.MapHttpRoute(
name: "DefaultApi",
//修改了这里,在controller和id中间加了action
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在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
{
///
/// 静态的Api控制器
///
public class StaticController : ApiController
{
///
/// 问好方法
///
/// 名字
/// 问好实体
[HttpGet]
public ResultEntity SayHello(string UserName)
{
return new ResultEntity()
{
Code = 400,
Msg = string.Format("Hello {0}", UserName)
};
}
///
/// 问别方法
///
/// 名字
/// 问别实体
[HttpGet]
public ResultEntity SayBye(string UserName)
{
return new ResultEntity()
{
Code = 400,
Msg = string.Format("ByeBye {0}", UserName)
};
}
///
/// 创建一个用来测试Swagger界面返回的实体
///
public class ResultEntity
{
///
/// 返回码
///
public int Code { get; set; }
///
/// 返回信息
///
public string Msg { get; set; }
}
}
}
启动项目,在浏览器地址后面输入Swagger,回车即可看到如下界面,恭喜,成功啦~
目前只能从CSDN上下载类库,直接以添加现有项目的方式添加入解决方案,下载地址
下载地址
在App_Start目录下,创建一个模块,如下:
///
/// WebApi层模块类
///
public class WebApiModule : SunLightModule
{
}
修改继承基类为SunLight.Dynamic.DynamicApiApplication,如下:
///
/// 注意,此处方法是Override
///
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);
}
1.新建一个类库DemoApplicaiton
2.定义一个接口,继承自SunLight.Dynamic.IApplicationService
///
/// 英雄相关接口
///
public interface IHeroService : IApplicationService
{
///
/// 根据英雄类别获取英雄列表
///
/// 英雄类别,0智力,1力量,2敏捷
///
List<HeroOutputDto> GetHeroListByType(int type);
///
/// 根据英雄Id获取英雄
///
///
///
HeroOutputDto GetHeroById(int Id);
}
3.定义该接口的实现类
public class HeroService : ApplicatonService, IHeroService
{
///
/// 根据英雄Id获取英雄
///
///
///
public HeroOutputDto GetHeroById(int Id)
{
var allheros = GetAllHeroList();
var wantHero = allheros.Find(m => m.HeroId == Id);
return wantHero;
}
///
/// 根据英雄类别获取英雄列表
///
/// 英雄类别,0智力,1力量,2敏捷
///
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;
}
///
/// 模拟一些数据
///
///
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"));
在WebApi项目的Module类上添加注解,想要生成几个Applcaiton项目的Api,就依赖几个,如注解内的注释代码
///
/// WebApi层模块类
///
[DependsOn(typeof(DemoModule)/*, DependsOn(typeof(Demo2Module)*/)]
public class WebApiModule : SunLightModule
{
}
在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}"
);
}
}
启动项目,并在浏览器地址栏输入Swagger后回车,即可看到根据Applicaiton动态生成的Api,还等什么,调用试试,享受下胜利的果实。