项目梳理4——WebApi项目,使用注释填充Description字段
web.config中添加连接字符串:

为webapi添加Description,使用注释来填充此字段

对于所有引用的xxxx.base项目设置生成的xml文档,注意release、debug下都需设置,并重新生成

xxxxx.WebApi\Areas\HelpPage\XmlDocumentationProvider.cs中,添加构造函数,用于解析xml文件:
/// <summary>
/// Initializes a new instance of the <see cref="XmlDocumentationProvider"/> class.
/// </summary>
/// <param name="documentPath">The physical path to XML document.</param>
public XmlDocumentationProvider(string documentPath)
{
if (documentPath == null)
{
throw new ArgumentNullException("documentPath");
}
XPathDocument xpath = new XPathDocument(documentPath);
_documentNavigator = xpath.CreateNavigator();
}
xxxxx.WebApi\Areas\HelpPage\App_Start\HelpPageConfig.cs中,,Register(HttpConfiguration config)方法的开头,添加代码:
var server = HttpContext.Current.Server;
String[] xmlFiles = System.IO.Directory.GetFiles(server.MapPath("~/App_Data"), "*.xml");
if (xmlFiles == null || xmlFiles.Length == 0)
{
xmlFiles = System.IO.Directory.GetFiles(server.MapPath("~/Bin"), "*.xml");
} if (xmlFiles != null && xmlFiles.Length > 0)
{
MultipleXmlDocumentationProvider mp = new MultipleXmlDocumentationProvider(xmlFiles);
config.SetDocumentationProvider(mp);
}
xxxxx.WebApi\Areas\HelpPage路径下添加MultipleXmlDocumentationProvider.cs
public class MultipleXmlDocumentationProvider : IDocumentationProvider, IModelDocumentationProvider
{
List<XmlDocumentationProvider> _listProviders = new List<XmlDocumentationProvider>();
public MultipleXmlDocumentationProvider(params String[] xmlDocPaths)
{
InitDocuments(xmlDocPaths);
} /// <summary>
/// 初始化文档,主要修复SeeAlso部分内容
/// </summary>
/// <param name="xmlDocPaths">xml文档路径</param>
protected void InitDocuments(params String[] xmlDocPaths)
{
var listXmlDocs = new List<XDocument>();
foreach (var xmlPath in xmlDocPaths)
{
var content = System.IO.File.ReadAllText(xmlPath);
listXmlDocs.Add(XDocument.Parse(content));
} var dictNameNodes = new Dictionary<String, XElement>();
foreach (var xmlDoc in listXmlDocs)
{
var methodNodes = xmlDoc.Root.Descendants().Where(n => n.Name.LocalName == "member");
foreach (var mn in methodNodes)
{
var name = mn.Attribute("name").Value;
dictNameNodes[name] = mn;
}
} foreach (var xmlDoc in listXmlDocs)
{
var saNodes = xmlDoc.Root.Descendants().Where(n => n.Name.LocalName == "seealso").ToList();
foreach(var saNode in saNodes)
{
if (saNode.Attribute("cref") == null) continue;
var crefValue = saNode.Attribute("cref").Value;
if (dictNameNodes.ContainsKey(crefValue))
{
var a = dictNameNodes[crefValue];
XLinqUtil.ReplaceOuterXml(saNode, XLinqUtil.InnerXML(a));
}
//XLinqUtil.ReplaceInnerXml(saNode,)
}
} foreach (var xmlDoc in listXmlDocs)
{
using (var ms = new System.IO.StringReader(xmlDoc.ToString(SaveOptions.OmitDuplicateNamespaces)))
{
_listProviders.Add(new XmlDocumentationProvider(ms));
}
}
} public string GetDocumentation(System.Web.Http.Controllers.HttpParameterDescriptor parameterDescriptor)
{
String result = null;
foreach (var provider in _listProviders)
{
result = provider.GetDocumentation(parameterDescriptor);
if (result != null) return result;
}
return result;
} public string GetDocumentation(System.Web.Http.Controllers.HttpActionDescriptor actionDescriptor)
{
String result = null;
foreach (var provider in _listProviders)
{
result = provider.GetDocumentation(actionDescriptor);
if (result != null) return result;
}
return result;
} public string GetDocumentation(System.Web.Http.Controllers.HttpControllerDescriptor controllerDescriptor)
{
String result = null;
foreach (var provider in _listProviders)
{
result = provider.GetDocumentation(controllerDescriptor);
if (result != null) return result;
}
return result;
} public string GetResponseDocumentation(System.Web.Http.Controllers.HttpActionDescriptor actionDescriptor)
{
String result = null;
foreach (var provider in _listProviders)
{
result = provider.GetResponseDocumentation(actionDescriptor);
if (result != null) return result;
}
return result;
} public string GetDocumentation(System.Reflection.MemberInfo member)
{
String result = null;
foreach (var provider in _listProviders)
{
result = provider.GetDocumentation(member);
if (result != null) return result;
}
return result;
} public string GetDocumentation(Type type)
{
String result = null;
foreach (var provider in _listProviders)
{
result = provider.GetDocumentation(type);
if (result != null) return result;
}
return result;
}
}
项目梳理4——WebApi项目,使用注释填充Description字段的更多相关文章
- Asp.net WebApi 项目示例(增删改查)
1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...
- OWIN 自宿主模式WebApi项目,WebApi层作为单独类库供OWIN调用
OWIN是Open Web Server Interface for .NET的首字母缩写,他的定义如下: OWIN在.NET Web Servers与Web Application之间定义了一套标准 ...
- WebAPI项目中使用SwaggerUI
1.创建webapi项目解决方案 2.引入Swagger组件 在项目引用中可以看到swagger的引用 3.webapi 项目右键属性->生成-> 勾选XML文档文件,然后将XML文件保存 ...
- AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目
创建webapi项目 创建四个webapi项目,两个处理业务,一个网关,一个验证中心.四个项目对应的端口如下, ApiGateway:1999 IdentityServer:16690 Service ...
- .Net Core3.0 WebApi 项目框架搭建 五: 轻量型ORM+异步泛型仓储
.Net Core3.0 WebApi 项目框架搭建:目录 SqlSugar介绍 SqlSugar是国人开发者开发的一款基于.NET的ORM框架,是可以运行在.NET 4.+ & .NET C ...
- .Net Core3.0 WebApi 项目框架搭建 二:API 文档神器 Swagger
.Net Core3.0 WebApi 项目框架搭建:目录 为什么使用Swagger 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.后端分离的形态,而且前端技术和后端技 ...
- .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证
.Net Core3.0 WebApi 项目框架搭建:目录 什么是JWT 根据维基百科定义,JWT(读作 [/dʒɒt/]),即JSON Web Tokens,是一种基于JSON的.用于在网络上声明某 ...
- Restful WebApi项目开发实践
前言 踩过了一段时间的坑,现总结一下,与大家分享,愿与大家一起讨论. Restful WebApi特点 WebApi相较于Asp.Net MVC/WebForm开发的特点就是前后端完全分离,后端使用W ...
- 基于空项目模板创建使用Owin来host的WebApi项目
首先创建一个空的web项目,如下图所示: 项目创建成功以后,安装下面三个package. Install-Package Microsoft.AspNet.WebApi -Version 5.2.2I ...
随机推荐
- mysql 用户与权限
1.用户 1)创建用户 "create user '用户'@'host' identified by '密码';" 在5.7以后的版本中要求密码包含至少一个大写字母,一个小写字 ...
- java-信息安全(十一)-非对称加密算法ECC以及ECDSA签名
概述 信息安全基本概念: ECC算法(Elliptic curve cryptography,椭圆曲线密码学) 一.ECC加密解密[暂时无意义] 椭圆加密算法(ECC)是一种公钥加密体制,最初由Kob ...
- [py][mx]django通过邮箱找回密码
忘记密码处理流程 注意: 这个文章里的找回密码页面截取有问题. 找回密码页应该是让输入邮箱 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的i ...
- [py][mx]django form验证-给db减压
django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ...
- Knight Moves(hdu1372 bfs模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Others) ...
- 二进制协议 vs 文本协议
二进制协议 vs 文本协议 在服务器程序开发过程中,各个服务直接需要进行交互.这样就需要定义消息的协议,一般来说协议主要包括二进制协议和文本协议,下面就我在工作中用到的两种协议说说自己的看法. 1 二 ...
- EM算法小结
一.什么是EM算法? EM算法是机器学习中一个很重要的算法,即期望最大化算法,主要包括以下两个步骤: E步骤:estimate the expected values M步骤:re-estimate ...
- #C++初学记录(贪心算法#结构体#贪心算法)
贪心算法#结构体 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋 ...
- 020-安装centos6.5后的生命历程
01.配置网络.修改了ifcfg-eth0文件内容. 1)ifcfg-eth0原来的内容如下: 2)ifcfg-eth0配置后的内容如下: 3)然后重启网络服务: 4)测试网络是否可通: 5)查看 ...
- 【转】eclipse反编译插件
原文地址:http://bbs.csdn.net/topics/390263414 离线安装包下载地址一:http://feeling.sourceforge.net/downloads/org.sf ...