.NET webAPI中集成swagger
最近做的项目使用winform三层+webapi,对于webAPI路由文档管理一直觉得单独做一些管理比较麻烦,并且测试的时候项目内的代码测试运行起来也比较麻烦,所以在网上开始检索相关办法,发现热度比较高的两种:
1.微软 HelpPage 2.swagger
第二种方案虽然官网文档比较难找,但是有很多实例,所以开始研究第二种,给大家看看效果:
API控制器总览
action和描述
直观的接口测试
使用swagger
1.创建webapi项目解决方案
2.引用swagger nuget包
Swashbuckle、Swagger.Net.UI(如果不需要调整在线测试页面可以不添加)两个包
3.卸载重复包Swagger.Net
引用Swagger.Net.UI时会引用Swagger.Net这个包,但是Swagger.Net的功能和Swashbuckle重复了。所以我采取了卸载Swagger.Net
4.添加接口注释
完成上面三部运行项目,可以看到接口描述已经生成,浏览地址http://xxx/Swagger。但是没有接口的注释,下面添加接口注释
项目属性->勾选生成xml文档文件
修改SwaggerConfig文件
private static string GetXmlCommentsPath() { return System.String.Format(@"{0}\bin\WebApi.XML", System.AppDomain.CurrentDomain.BaseDirectory); }
以上两者必须保持一致
winform通过Swagger生成的本地XML读取路由
1.在action注释的地方加上路径
2.把webAPI项目内生成的XML文档拷贝到winform项目的基路径
3.XML读取action路径方法:
/// <summary> /// WebAPI路由方法文件 /// </summary> public static string Path { get { string _path = AppDomain.CurrentDomain.BaseDirectory + "WebAPI.xml"; return _path; } } /// <summary> /// 查询XML节点 /// </summary> /// <param name="functionname"></param> /// <returns></returns> public static CONFIG_FUNCTION ReadNodeXML(string functionname) { try { string controllerName; CONFIG_FUNCTION model = new CONFIG_FUNCTION(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Path); XmlNodeList nodeList1 = xmlDoc.SelectSingleNode("doc").ChildNodes;//获取Controllers节点的所有子节点 members XmlNodeList nodeList = nodeList1[1].SelectNodes("member"); foreach (XmlNode xn in nodeList)//遍历所有子节点 { XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 string name= xe.GetAttribute("name").ToString(); if (name.Contains("Controller.") && name.Contains("(")) { controllerName = name.Substring(name.IndexOf("Controller.") + 11, (name.IndexOf("(") - name.IndexOf("Controller.") - 11)); if (controllerName == functionname) { model.FUNCTIONNAME = controllerName; XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点 foreach (XmlNode xn1 in nls)//遍历 { XmlElement xe2 = (XmlElement)xn1;//转换类型 if (xe2.Name == "url")//如果找到 model.FUNCTIONPATH = xe2.InnerText; } } } } return model; } catch (Exception ex) { throw ex; } }