ASP.NET WebApi Document Helper
本项目实现了ASP.NET WebApi 接口文档的自动生成功能。
微软出的ASP.NET WebApi Help Page固然好用,但是我们项目基于Owin 平台的纯WebApi 项目,不想引入MVC 的依赖,因此我们需要定制下ASP.NET WebApi Help Page。
首先来个学生习作版本:
var info = typeof(AccountController);
var sb = new StringBuilder();
var methods = info.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var m in methods)
{
sb.AppendLine(m.Name);
var pi = m.GetParameters();
//Get Http Method
var postAtts = m.GetCustomAttributes(typeof(HttpPostAttribute), false);
if (postAtts.Count() != 0)
{
sb.AppendLine("POST");
}
else
{
sb.AppendLine("GET");
}
//Get Route
var routeAtts = m.GetCustomAttributes(typeof(RouteAttribute), false);
if (postAtts.Count() != 0)
{
var routeTemp = (RouteAttribute)routeAtts[0];
sb.AppendLine(routeTemp.Template);
}
//Get parameter
foreach (ParameterInfo t in pi)
{
var tt = t.ParameterType;
if (tt == typeof(string))
{
sb.AppendLine("Query String : " + t.Name + "={string}");
}
else if (tt == typeof(Guid))
{
sb.AppendLine("Query String Or URL : " + t.Name + "={guid}");
}
else if (tt.BaseType == typeof(Enum))
{
sb.AppendLine("Query String : " + t.Name + "={Enum}");
}
else if (tt.BaseType == typeof(object))
{
var paramter = Activator.CreateInstance(tt);
var json = JsonHelper.ToJsonString(paramter);
json = json.Replace("null", "\"string\"");
sb.AppendLine(json);
}
}
sb.AppendLine();
}
var result = sb.ToString();
这种东西只能写作业的时候随便写写,用到项目中还是差点火候的。我们接下去进入正题。帮助页面必然分为一个Index, 一个Detail。Index 页面需要获取所有的Controller 以及下面的Action。研究了下代码,发现系统以及给我们封装好了对应的方法,直接调用即可。
[HttpGet]
[Route("api/Helps")]
public HttpResponseMessage Index()
{
var descriptions = Configuration.Services.GetApiExplorer().ApiDescriptions;
var groups = descriptions.ToLookup(api => api.ActionDescriptor.ControllerDescriptor);
StringBuilder html = GetHtmlFromDescriptionGroup(groups);
var response = this.Request.CreateResponse();
response.Content = new StringContent(html.ToString(), Encoding.UTF8, "text/HTML");
return response;
}
由于是纯API的,返回的HTML就不用什么模板了,直接拼接字符串搞定。
Index 向Detail 跳转,这里有一个有意思的方法:
public static string GetFriendlyId(this ApiDescription description)
{
string path = description.RelativePath;
string[] urlParts = path.Split('?');
string localPath = urlParts[0];
string queryKeyString = null;
if (urlParts.Length > 1)
{
string query = urlParts[1];
string[] queryKeys = HttpUtility.ParseQueryString(query).AllKeys;
queryKeyString = String.Join("_", queryKeys);
}
StringBuilder friendlyPath = new StringBuilder();
friendlyPath.AppendFormat("{0}-{1}",
description.HttpMethod.Method,
localPath.Replace("/", "-").Replace("{", String.Empty).Replace("}", String.Empty));
if (queryKeyString != null)
{
friendlyPath.AppendFormat("_{0}", queryKeyString.Replace('.', '-'));
}
return friendlyPath.ToString();
}
然后在详情界面里解析出我们需要的参数,以及自动生成sample
[HttpGet]
[Route("api/Helps/Detail")]
public HttpResponseMessage Detail(string apiId)
{
var apiModel = Configuration.GetHelpPageApiModel(apiId);
var html = GetHtmlFromApiModel(apiModel);
var response = this.Request.CreateResponse();
response.Content = new StringContent(html.ToString(), Encoding.UTF8, "text/HTML");
return response;
}
大概耗时3个hour,最后发现基本上是直接搬运了代码,用StringBuilder 代替了view 部分就完成了我们想要的功能,一种搬砖的感觉油然而生,这样的感觉不好。
ASP.NET WebApi Document Helper的更多相关文章
- OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and consumption of quer ...
- 【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi
一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年a ...
- Asp.net WebAPI 单元测试
现在Asp.net webapi 运用的越来越多,其单元而是也越来越重要.一般软件开发都是多层结构,上层调用下层的接口,而各层的实现人员不同,一般大家都只写自己对应单元测试.对下层的依赖我们通过IOC ...
- Using ASP.Net WebAPI with Web Forms
Asp.Net WebAPI is a framework for building RESTful HTTP services which can be used across a wide ran ...
- 前端angularjs+requirejs+dhtmlx 后端asp.net webapi
享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi 一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家 ...
- ASP.NET WebAPI使用Swagger生成测试文档
ASP.NET WebAPI使用Swagger生成测试文档 SwaggerUI是一个简单的Restful API测试和文档工具.简单.漂亮.易用(官方demo).通过读取JSON配置显示API .项目 ...
- ASP.NET WebAPI 测试文档 (Swagger)
ASP.NET WebAPI使用Swagger生成测试文档 SwaggerUI是一个简单的Restful API测试和文档工具.简单.漂亮.易用(官方demo).通过读取JSON配置显示API .项目 ...
- [转]OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
本文转自:http://www.cnblogs.com/bluedoctor/p/4384659.html 一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open ...
- ASP.NET WebApi 中使用swagger 构建在线帮助文档
1 在Visual Studio 中创建一个Asp.NET WebApi 项目,项目名:Com.App.SysApi(本例创建的是 .net 4.5 框架程序) 2 打开Nuget 包管理软件,查 ...
随机推荐
- JavaScript基础介绍
JavaScript组成 •ECMAScript:解释器.翻译 •DOM:Document Object Model •BOM:Browser Object Model –各组成部分的兼容性,兼容性问 ...
- haproxy simple cfg
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group hap ...
- wireshark 和 Httpwatch tcpdump
wireshark 功能强大,适用性高.过滤功能好. Httpwatch 功能单一,优缺点明显,但是非常适合抓取http交互的包,而且可以非常明确的显示出整个的交互过程. tcpdump linux ...
- ios xib 中的 size class
需要阅读UITraitCollection的说明文档,先截图如下: 今天说说xib中的size class的简单设置,先看图 一共有9个小块,水平方向代表width,垂直方向代表height. 对于w ...
- PHP接入umeditor(百度富文本编辑器)
2015年6月28日 23:08:49 星期日 效果: 开搞;) 首先: 百度官网上下载 umeditor 简版的富文本编辑器(这里) 然后: 解压放到自己的项目中, 配置服务器, 保证能在浏览器端加 ...
- CentOS 6.6 (Desktop)部署Apache、MySQL以及Eclipse Luna等记录
内容较多,持续更新(2015-03-12 16:37:05) *如果没有特别说明,以下操作都是在root账号下完成,图形界面为GNOME. 一.防火墙 先从防火墙入手,为了后续的环境搭建,需要打开80 ...
- Mathematics:GCD & LCM Inverse(POJ 2429)
根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...
- hdu 1972.Printer Queue 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1972 题目意思:需要模拟打印机打印.打印机里面有一些 job,每个job被赋予1-9的其中一个值,越大 ...
- ORACLE 远程导入导出数据库
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. ...
- asp.net 曲线图
public void draw(DataTable dt) { //取得记录数量 int count = dt.Rows.Count; //记算图表宽度 int wd = 80 + 20 * (co ...