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字段的更多相关文章

  1. Asp.net WebApi 项目示例(增删改查)

    1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...

  2. OWIN 自宿主模式WebApi项目,WebApi层作为单独类库供OWIN调用

    OWIN是Open Web Server Interface for .NET的首字母缩写,他的定义如下: OWIN在.NET Web Servers与Web Application之间定义了一套标准 ...

  3. WebAPI项目中使用SwaggerUI

    1.创建webapi项目解决方案 2.引入Swagger组件 在项目引用中可以看到swagger的引用 3.webapi 项目右键属性->生成-> 勾选XML文档文件,然后将XML文件保存 ...

  4. AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目

    创建webapi项目 创建四个webapi项目,两个处理业务,一个网关,一个验证中心.四个项目对应的端口如下, ApiGateway:1999 IdentityServer:16690 Service ...

  5. .Net Core3.0 WebApi 项目框架搭建 五: 轻量型ORM+异步泛型仓储

    .Net Core3.0 WebApi 项目框架搭建:目录 SqlSugar介绍 SqlSugar是国人开发者开发的一款基于.NET的ORM框架,是可以运行在.NET 4.+ & .NET C ...

  6. .Net Core3.0 WebApi 项目框架搭建 二:API 文档神器 Swagger

    .Net Core3.0 WebApi 项目框架搭建:目录 为什么使用Swagger 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.后端分离的形态,而且前端技术和后端技 ...

  7. .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证

    .Net Core3.0 WebApi 项目框架搭建:目录 什么是JWT 根据维基百科定义,JWT(读作 [/dʒɒt/]),即JSON Web Tokens,是一种基于JSON的.用于在网络上声明某 ...

  8. Restful WebApi项目开发实践

    前言 踩过了一段时间的坑,现总结一下,与大家分享,愿与大家一起讨论. Restful WebApi特点 WebApi相较于Asp.Net MVC/WebForm开发的特点就是前后端完全分离,后端使用W ...

  9. 基于空项目模板创建使用Owin来host的WebApi项目

    首先创建一个空的web项目,如下图所示: 项目创建成功以后,安装下面三个package. Install-Package Microsoft.AspNet.WebApi -Version 5.2.2I ...

随机推荐

  1. 纯css打造凹进与突出效果

    1.凹进效果   background:#f2f2f2  center repeat; border-bottom: 1px solid #e9e9e9;border-top: 1px solid # ...

  2. Mirror--如何在主库上增加文件

    由于各种原因,如磁盘不空不足,需要对主库增加数据库文件到其他磁盘上,而镜像服务器上没有对应盘符,很多人会选择删除镜像,重新完备还原来搭建镜像,这种方式耗时耗力. 在做此类操作时,需要对主服务器和镜像服 ...

  3. 腾讯云的云数据库MYSQL配置

    腾讯云的云数据库MYSQL配置

  4. RGB颜色参考

    实色效果 英文名称 R.G.B 16色 实色效果 英文名称 R.G.B 16色   Snow 255 250 250 #FFFAFA   PaleTurquoise1 187 255 255 #BBF ...

  5. 实习培训——Servlet(6)

    实习培训——Servlet(6) 1  Servlet 客户端 HTTP 请求 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的 ...

  6. [LeetCode] 796. Rotate String_Easy **KMP

    We are given two strings, A and B. A shift on A consists of taking string A and moving the leftmost ...

  7. pycharm Unresolved reference 无法引入包

    1. 问题描述: 在项目中P存在文件夹A.B.C,A有文件夹a和b,在a中引入b的一个类, a.py: from b import func1 虽然运行成功,但是在Pycharm中显示: Unreso ...

  8. 为什么size_t重要?

    参见 http://en.cppreference.com/w/cpp/types/size_t size_t其实与uintptr_t一个道理.就是一个东西.指针其实就是寻址,与地址总线位数一致,编译 ...

  9. 你真的了解[super ]关键字吗?

    前言 此篇文章是看了阮老师的es6教程,看到super关键字的时候觉得有必要总结梳理一下,原文还是参考 ECMAScript 6入门. 正文 super 这个关键字,既可以当作函数使用,也可以当作对象 ...

  10. linux make configure make

    开放源码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行: 编译程序:将程序代码转译成为机器看得懂的语言,就类似编译者的角色: 可执行文件:经过编译程序变成二进制后机器看得懂所以可以 ...