一、从创建MVC WebApi开始

第一步创建MVC WebApi就创建好了,接下来就进入正题,上干货

==========================================================================================================

二 、使用nuget引入Swashbuckle包

下载完成后App_Start文件夹下会多出一个SwaggerConfig文件

第二步就完成了,然后就是进行配置Swagger了

======================================================================

三、打开项目属性->生成,勾选生成xml文档文件(注:最好选择默认,因为之后还需要用到)

=======================================================================

四、配置SwaggerConfig文件

(1)把代码(var xmlAPI = $@"{AppDomain.CurrentDomain.BaseDirectory}\bin\WebApplication.xml";)放到Register中

  1.   .EnableSwagger(c =>
                        {
                            c.SingleApiVersion("v1", "CreateSwaggerApi");
                            var xmlAPI = $@"{AppDomain.CurrentDomain.BaseDirectory}\bin\WebApplication.xml";//刚刚生成的XML注释文件

                        })

(2)把代码(c.IncludeXmlComments(xmlAPI);)放到.EnableSwagger中

  1. c.IncludeXmlComments(xmlAPI);

这时候初始已经完成了,现在来看看结果

我们刚开始运行的是默认的地址,这时候只要手动在端口号后边加上Swagger然后回车就可以看到我们想看到的页面了

五、汉化

(1)首先需要新建一个汉化的JS文件,最好建立在Script下边,JS文件名字自己定义,然后把代码复制进去

  1. /// <summary>
  2. /// 中文转换
  3. /// </summary>
  4. var SwaggerTranslator = (function () {
  5. //定时执行检测是否转换成中文,最多执行500次 即500*50/1000=25s
  6. var iexcute = 0,
  7. //中文语言包
  8. _words = {
  9. "Warning: Deprecated": "警告:已过时",
  10. "Implementation Notes": "实现备注",
  11. "Response Class": "响应类",
  12. "Status": "状态",
  13. "Parameters": "参数",
  14. "Parameter": "参数",
  15. "Value": "值",
  16. "Description": "描述",
  17. "Parameter Type": "参数类型",
  18. "Data Type": "数据类型",
  19. "Response Messages": "响应消息",
  20. "HTTP Status Code": "HTTP状态码",
  21. "Reason": "原因",
  22. "Response Model": "响应模型",
  23. "Request URL": "请求URL",
  24. "Response Body": "响应体",
  25. "Response Code": "响应码",
  26. "Response Headers": "响应头",
  27. "Hide Response": "隐藏响应",
  28. "Headers": "头",
  29. "Try it out!": "试一下!",
  30. "Show/Hide": "显示/隐藏",
  31. "List Operations": "显示操作",
  32. "Expand Operations": "展开操作",
  33. "Raw": "原始",
  34. "can't parse JSON. Raw result": "无法解析JSON. 原始结果",
  35. "Model Schema": "模型架构",
  36. "Model": "模型",
  37. "apply": "应用",
  38. "Username": "用户名",
  39. "Password": "密码",
  40. "Terms of service": "服务条款",
  41. "Created by": "创建者",
  42. "See more at": "查看更多:",
  43. "Contact the developer": "联系开发者",
  44. "api version": "api版本",
  45. "Response Content Type": "响应Content Type",
  46. "fetching resource": "正在获取资源",
  47. "fetching resource list": "正在获取资源列表",
  48. "Explore": "浏览",
  49. "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
  50. "Can't read from server. It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置access-control-origin。",
  51. "Please specify the protocol for": "请指定协议:",
  52. "Can't read swagger JSON from": "无法读取swagger JSON于",
  53. "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染Swagger UI",
  54. "Unable to read api": "无法读取api",
  55. "from path": "从路径",
  56. "Click to set as parameter value": "点击设置参数",
  57. "server returned": "服务器返回"
  58. },
  59.  
  60. //定时执行转换
  61. _translator2Cn = function () {
  62. if ($("#resources_container .resource").length > 0) {
  63. _tryTranslate();
  64. }
  65.  
  66. if ($("#explore").text() == "Explore" && iexcute < 500) {
  67. iexcute++;
  68. setTimeout(_translator2Cn, 50);
  69. }
  70. },
  71.  
  72. //设置控制器注释
  73. _setControllerSummary = function () {
  74. $.ajax({
  75. type: "get",
  76. async: true,
  77. url: $("#input_baseUrl").val(),
  78. dataType: "json",
  79. success: function (data) {
  80. var summaryDict = data.ControllerDesc;
  81. var id, controllerName, strSummary;
  82. $("#resources_container .resource").each(function (i, item) {
  83. id = $(item).attr("id");
  84. if (id) {
  85. controllerName = id.substring(9);
  86. strSummary = summaryDict[controllerName];
  87. if (strSummary) {
  88. $(item).children(".heading").children(".options").prepend('<li class="controller-summary" title="' + strSummary + '">' + strSummary + '</li>');
  89. }
  90. }
  91. });
  92. }
  93. });
  94. },
  95.  
  96. //尝试将英文转换成中文
  97. _tryTranslate = function () {
  98. $('[data-sw-translate]').each(function () {
  99. $(this).html(_getLangDesc($(this).html()));
  100. $(this).val(_getLangDesc($(this).val()));
  101. $(this).attr('title', _getLangDesc($(this).attr('title')));
  102. });
  103. },
  104. _getLangDesc = function (word) {
  105. return _words[$.trim(word)] !== undefined ? _words[$.trim(word)] : word;
  106. };
  107.  
  108. return {
  109. Translator: function () {
  110. document.title = "API描述文档";
  111. $('body').append('<style type="text/css">.controller-summary{color:#10a54a !important;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px;text-align:right;cursor:default;} </style>');
  112. $("#logo").html("接口描述").attr("href", "/Home/Index");
  113. //设置控制器描述
  114. _setControllerSummary();
  115. _translator2Cn();
  116. }
  117. }
  118. })();
  119. //执行转换
  120. SwaggerTranslator.Translator();

第一步有了然后修改JS的文件属性,生成设置修改为嵌入式文件

然后在SwaggerConfig文件里加入配置

  1.  c.InjectJavaScript(thisAssembly, "WebApplication.Scripts.Swagger_Lener.js");//JS就是你自己定义的JS

================================================================================

六、在App_Start目录下创建类文件CachingSwaggerProvider(直接创建CachingSwaggerProvider类,然后复制下边代码就ok,如果报红,引用一下文件就好)

  1. public class CachingSwaggerProvider : ISwaggerProvider
  2. {
  3. private readonly ISwaggerProvider _swaggerProvider;
  4. private static ConcurrentDictionary<string, SwaggerDocument> _cache =
  5. new ConcurrentDictionary<string, SwaggerDocument>();
  6. private readonly string _xml;
  7.  
  8. public CachingSwaggerProvider(ISwaggerProvider swaggerProvider, string xml)
  9. {
  10. _swaggerProvider = swaggerProvider;
  11. _xml = xml;
  12. }
  13.  
  14. public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
  15. {
  16. var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
  17. SwaggerDocument srcDoc = null;
  18. //只读取一次
  19. if (!_cache.TryGetValue(cacheKey, out srcDoc))
  20. {
  21. srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
  22.  
  23. srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } };
  24. _cache.TryAdd(cacheKey, srcDoc);
  25. }
  26. return srcDoc;
  27. }
  28.  
  29. /// <summary>
  30. /// 从API文档中读取控制器描述
  31. /// </summary>
  32. /// <returns>所有控制器描述</returns>
  33. public ConcurrentDictionary<string, string> GetControllerDesc()
  34. {
  35. string xmlpath = _xml;
  36. ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
  37. if (File.Exists(xmlpath))
  38. {
  39. XmlDocument xmldoc = new XmlDocument();
  40. xmldoc.Load(xmlpath);
  41. string type = string.Empty, path = string.Empty, controllerName = string.Empty;
  42.  
  43. string[] arrPath;
  44. int length = -1, cCount = "Controller".Length;
  45. XmlNode summaryNode = null;
  46. foreach (XmlNode node in xmldoc.SelectNodes("//member"))
  47. {
  48. type = node.Attributes["name"].Value;
  49. if (type.StartsWith("T:"))
  50. {
  51. //控制器
  52. arrPath = type.Split('.');
  53. length = arrPath.Length;
  54. controllerName = arrPath[length - 1];
  55. if (controllerName.EndsWith("Controller"))
  56. {
  57. //获取控制器注释
  58. summaryNode = node.SelectSingleNode("summary");
  59. string key = controllerName.Remove(controllerName.Length - cCount, cCount);
  60. if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
  61. {
  62. controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
  63. }
  64. }
  65. }
  66. }
  67. }
  68. return controllerDescDict;
  69. }
  70. }

=======================================================================

七、还需要再在SwaggerConfig文件里加入配置

  1. c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider, xmlAPI));
  2. c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

===============================================================================================

八、老天啊,最后一步了,做这玩意真是累啊,靠,      打开 App_Start文件下的WebApiConfig文件然后添加一个action就OK啦。

从头到尾自己动手试的,没得问题,有问题我也解决不了,我只是个代码的搬运工,如果你看不下去,请去https://www.cnblogs.com/xiaonangua/p/11766486.html

好累啊,好累,一晚没睡整这玩意,不容易啊。

MVC-WebApi配置 Swagger(Web Api可视化文档)的更多相关文章

  1. golang学习笔记7 使用beego swagger 实现API自动化文档

    golang学习笔记7 使用beego swagger 实现API自动化文档 API 自动化文档 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/doc ...

  2. spring boot使用swagger生成api接口文档

    前言 在之前的文章中,使用mybatis-plus生成了对应的包,在此基础上,我们针对项目的api接口,添加swagger配置和注解,生成swagger接口文档 具体可以查看本站spring boot ...

  3. 用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档.

  4. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  5. Spring Boot2配置Swagger2生成API接口文档

    一.Swagger2介绍 前后端分离开发模式中,api文档是最好的沟通方式. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 及时性 (接 ...

  6. asp.net web api帮助文档的说明

    为asp.net的mvc web api填写自己的帮助文档 1. 加入Help的area(能够通过命令行或其它方式加入) 命令行:Install-Package Microsoft.AspNet.We ...

  7. .NET Core使用swagger进行API接口文档管理

    一.问题背景 随着技术的发展,现在的开发模式已经更多的转向了前后端分离的模式,在前后端开发的过程中,联系的方式也变成了API接口,但是目前项目中对于API的管理很多时候还是通过手工编写文档,每次的需求 ...

  8. swagger:API在线文档自动生成框架

    传统的API从开发测试开始我们经常借用类似Postman.fiddle等等去做接口测试等等工具:Swagger 为API的在线测试.在线文档提供了一个新的简便的解决方案: NET 使用Swagger ...

  9. SpringBoot18 Swagger、API接口文档生成、WireMock、模拟后台数据

    1 Swagger 1.1 简述 前后端分离的项目需要前后端开发人员协同工作,后台开发人员需要给到前端开发者一套API文档:利用Swagger可以简单高效的帮助后台开发者生成RestfulAPI开发文 ...

随机推荐

  1. 8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇

    本文作为图解java并发编程的第二篇,前一篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现 ...

  2. OneDrive 折腾记

    起因 百度云的一系列劝退操作 OneDrive 5T 有点香 OneDrive 介绍 OneDrive有两种, 个人版 OneDrive 和 教育企业版 OneDrive for Business 个 ...

  3. C#中部分重点前端设置问题

    背景 在工作及学习过程中经常会遇到一些奇怪的需求,这里便会记录我遇到的奇怪需求及解决方法. 内容 一.动态设置页面标题 1.前端设置 JS代码: document.title="这是一个标题 ...

  4. leetcode刷题-83删除排序链表中的重复元素

    题目 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 实现 # Definition for singly-li ...

  5. Python中的type(),isinstance,()dir(),的区别

    1.type() type(),获取一个变量的类型,返回值为:<class '类名'>,属于class类型2.isinstance() isinstance(),判断一个对象是否属于某种数 ...

  6. Gradle系列之Android Gradle高级配置

    本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ...

  7. Java Web学习(七)HttpServletResponse(客户端响应)

    一.定义 HttpServletResponse对象代表服务端的响应,通过这个对象提供的方法,可以向客户机输出数据. 二.常用方法 在JavaWeb开发中,只要是写URL地址,那么建议最好以" ...

  8. 在Kubernetes上部署应用时我们常忽略的几件事

    根据我的经验,大多数人(使用Helm或手动yaml)将应用程序部署到Kubernetes上,然后认为他们就可以一直稳定运行. 然而并非如此,实际使用过程还是遇到了一些"陷阱",我希 ...

  9. Centos-网络下载文件-wget

    wget 指定URL从网络上下载某个文件,需要网络连接 相关选项 -nc 不覆盖同名文件 -q    安静下载,无输出 -v    显示下载详情 -O   指定保存目录或重命名下载文件名 -c 断点续 ...

  10. CTFshow_Web入门源码

    Web1 题目打开始是这样的 直接看源码 Web2 题目打开是这样的,右键无法打开菜单,无法查看源码,F12也不可以 更改JavaScript权限,即可查看源码 Web3 真就抓个包看看 Web4 访 ...