C# .net webapi使用swagger时显示controller注释
        【摘要】 
                    App_Start目录下新建SwaggerCacheProvider.cs 
using Swashbuckle.Swagger;using System;using System.Collections.Concurrent;using System.Collections.Generic;using System.IO;using ...
    
    
    
    App_Start目录下新建SwaggerCacheProvider.cs
  
   - 
    
     
    
    
     
      using Swashbuckle.Swagger;
     
    
 
   - 
    
     
    
    
     
      using System;
     
    
 
   - 
    
     
    
    
     
      using System.Collections.Concurrent;
     
    
 
   - 
    
     
    
    
     
      using System.Collections.Generic;
     
    
 
   - 
    
     
    
    
     
      using System.IO;
     
    
 
   - 
    
     
    
    
     
      using System.Linq;
     
    
 
   - 
    
     
    
    
     
      using System.Web;
     
    
 
   - 
    
     
    
    
     
      using System.Xml;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      namespace YFAPICommon.App_Start
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
         /// <summary>
     
    
 
   - 
    
     
    
    
         /// swagger 显示控制器的描述
     
    
 
   - 
    
     
    
    
         /// </summary>
     
    
 
   - 
    
     
    
    
         public class SwaggerCacheProvider : ISwaggerProvider
     
    
 
   - 
    
     
    
    
     
          {
     
    
 
   - 
    
     
    
    
             private readonly ISwaggerProvider _swaggerProvider;
     
    
 
   - 
    
     
    
    
             private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
     
    
 
   - 
    
     
    
    
             private readonly string _xmlPath;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
             /// <summary>
     
    
 
   - 
    
     
    
    
             /// 
     
    
 
   - 
    
     
    
    
             /// </summary>
     
    
 
   - 
    
     
    
    
             /// <param name="swaggerProvider"></param>
     
    
 
   - 
    
     
    
    
             /// <param name="xmlpath">xml文档路径</param>
     
    
 
   - 
    
     
    
    
             public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath)
     
    
 
   - 
    
     
    
    
     
              {
     
    
 
   - 
    
     
    
    
     
                  _swaggerProvider = swaggerProvider;
     
    
 
   - 
    
     
    
    
     
                  _xmlPath = xmlpath;
     
    
 
   - 
    
     
    
    
     
              }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
             public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
     
    
 
   - 
    
     
    
    
     
              {
     
    
 
   - 
    
     
    
    
                 var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
     
    
 
   - 
    
     
    
    
                 //只读取一次
     
    
 
   - 
    
     
    
    
                 if (!_cache.TryGetValue(cacheKey, out SwaggerDocument srcDoc))
     
    
 
   - 
    
     
    
    
     
                  {
     
    
 
   - 
    
     
    
    
     
                      srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
                      srcDoc.vendorExtensions = new Dictionary<string, object>
     
    
 
   - 
    
     
    
    
     
                  {
     
    
 
   - 
    
     
    
    
     
                      { "ControllerDesc", GetControllerDesc() }
     
    
 
   - 
    
     
    
    
     
                  };
     
    
 
   - 
    
     
    
    
     
                      _cache.TryAdd(cacheKey, srcDoc);
     
    
 
   - 
    
     
    
    
     
                  }
     
    
 
   - 
    
     
    
    
                 return srcDoc;
     
    
 
   - 
    
     
    
    
     
              }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
             /// <summary>
     
    
 
   - 
    
     
    
    
             /// 从API文档中读取控制器描述
     
    
 
   - 
    
     
    
    
             /// </summary>
     
    
 
   - 
    
     
    
    
             /// <returns>所有控制器描述</returns>
     
    
 
   - 
    
     
    
    
             public ConcurrentDictionary<string, string> GetControllerDesc()
     
    
 
   - 
    
     
    
    
     
              {
     
    
 
   - 
    
     
    
    
     
                  ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
     
    
 
   - 
    
     
    
    
                 if (File.Exists(_xmlPath))
     
    
 
   - 
    
     
    
    
     
                  {
     
    
 
   - 
    
     
    
    
     
                      XmlDocument xmldoc = new XmlDocument();
     
    
 
   - 
    
     
    
    
     
                      xmldoc.Load(_xmlPath);
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
                     string[] arrPath;
     
    
 
   - 
    
     
    
    
                     int cCount = "Controller".Length;
     
    
 
   - 
    
     
    
    
                     foreach (XmlNode node in xmldoc.SelectNodes("//member"))
     
    
 
   - 
    
     
    
    
     
                      {
     
    
 
   - 
    
     
    
    
                         string type = node.Attributes["name"].Value;
     
    
 
   - 
    
     
    
    
                         if (type.StartsWith("T:"))
     
    
 
   - 
    
     
    
    
     
                          {
     
    
 
   - 
    
     
    
    
     
                              arrPath = type.Split('.');
     
    
 
   - 
    
     
    
    
                             string controllerName = arrPath[arrPath.Length - 1];
     
    
 
   - 
    
     
    
    
                             if (controllerName.EndsWith("Controller"))  //控制器
     
    
 
   - 
    
     
    
    
     
                              {
     
    
 
   - 
    
     
    
    
                                 //获取控制器注释
     
    
 
   - 
    
     
    
    
     
                                  XmlNode summaryNode = node.SelectSingleNode("summary");
     
    
 
   - 
    
     
    
    
                                 string key = controllerName.Remove(controllerName.Length - cCount, cCount);
     
    
 
   - 
    
     
    
    
                                 if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
     
    
 
   - 
    
     
    
    
     
                                  {
     
    
 
   - 
    
     
    
    
     
                                      controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
     
    
 
   - 
    
     
    
    
     
                                  }
     
    
 
   - 
    
     
    
    
     
                              }
     
    
 
   - 
    
     
    
    
     
                          }
     
    
 
   - 
    
     
    
    
     
                      }
     
    
 
   - 
    
     
    
    
     
                  }
     
    
 
   - 
    
     
    
    
                 return controllerDescDict;
     
    
 
   - 
    
     
    
    
     
              }
     
    
 
   - 
    
     
    
    
     
          }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
 
2.项目根目录下添加swagger.js文件
  
   - 
    
     
    
    
     
      'use strict';
     
    
 
   - 
    
     
    
    
     
      window.SwaggerTranslator = {
     
    
 
   - 
    
     
    
    
         _words: [],
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
         translate: function () {
     
    
 
   - 
    
     
    
    
             var $this = this;
     
    
 
   - 
    
     
    
    
     
              $('[data-sw-translate]').each(function () {
     
    
 
   - 
    
     
    
    
     
                  $(this).html($this._tryTranslate($(this).html()));
     
    
 
   - 
    
     
    
    
     
                  $(this).val($this._tryTranslate($(this).val()));
     
    
 
   - 
    
     
    
    
     
                  $(this).attr('title', $this._tryTranslate($(this).attr('title')));
     
    
 
   - 
    
     
    
    
     
              });
     
    
 
   - 
    
     
    
    
     
          },
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
         setControllerSummary: function () {
     
    
 
   - 
    
     
    
    
     
              $.ajax({
     
    
 
   - 
    
     
    
    
                 type: "get",
     
    
 
   - 
    
     
    
    
                 async: true,
     
    
 
   - 
    
     
    
    
                 url: $("#input_baseUrl").val(),
     
    
 
   - 
    
     
    
    
                 dataType: "json",
     
    
 
   - 
    
     
    
    
                 success: function (data) {
     
    
 
   - 
    
     
    
    
                     var summaryDict = data.ControllerDesc;
     
    
 
   - 
    
     
    
    
                     var id, controllerName, strSummary;
     
    
 
   - 
    
     
    
    
     
                      $("#resources_container .resource").each(function (i, item) {
     
    
 
   - 
    
     
    
    
     
                          id = $(item).attr("id");
     
    
 
   - 
    
     
    
    
                         if (id) {
     
    
 
   - 
    
     
    
    
     
                              controllerName = id.substring(9);
     
    
 
   - 
    
     
    
    
     
                              strSummary = summaryDict[controllerName];
     
    
 
   - 
    
     
    
    
                             if (strSummary) {
     
    
 
   - 
    
     
    
    
     
                                  $(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" style="font-weight: bold;" title="' + strSummary + '">' + strSummary + '</li>');
     
    
 
   - 
    
     
    
    
     
                              }
     
    
 
   - 
    
     
    
    
     
                          }
     
    
 
   - 
    
     
    
    
     
                      });
     
    
 
   - 
    
     
    
    
     
                  }
     
    
 
   - 
    
     
    
    
     
              });
     
    
 
   - 
    
     
    
    
     
          },
     
    
 
   - 
    
     
    
    
         _tryTranslate: function (word) {
     
    
 
   - 
    
     
    
    
             return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;
     
    
 
   - 
    
     
    
    
     
          },
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
         learn: function (wordsMap) {
     
    
 
   - 
    
     
    
    
             this._words = wordsMap;
     
    
 
   - 
    
     
    
    
     
          }
     
    
 
   - 
    
     
    
    
     
      };
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      /* jshint quotmark: double */
     
    
 
   - 
    
     
    
    
     
      window.SwaggerTranslator.learn({
     
    
 
   - 
    
     
    
    
         "Warning: Deprecated": "警告:已过时",
     
    
 
   - 
    
     
    
    
         "Implementation Notes": "实现备注",
     
    
 
   - 
    
     
    
    
         "Response Class": "响应类",
     
    
 
   - 
    
     
    
    
         "Status": "状态",
     
    
 
   - 
    
     
    
    
         "Parameters": "参数",
     
    
 
   - 
    
     
    
    
         "Parameter": "参数",
     
    
 
   - 
    
     
    
    
         "Value": "值",
     
    
 
   - 
    
     
    
    
         "Description": "描述",
     
    
 
   - 
    
     
    
    
         "Parameter Type": "参数类型",
     
    
 
   - 
    
     
    
    
         "Data Type": "数据类型",
     
    
 
   - 
    
     
    
    
         "Response Messages": "响应消息",
     
    
 
   - 
    
     
    
    
         "HTTP Status Code": "HTTP 状态码",
     
    
 
   - 
    
     
    
    
         "Reason": "原因",
     
    
 
   - 
    
     
    
    
         "Response Model": "响应模型",
     
    
 
   - 
    
     
    
    
         "Request URL": "请求 URL",
     
    
 
   - 
    
     
    
    
         "Response Body": "响应体",
     
    
 
   - 
    
     
    
    
         "Response Code": "响应码",
     
    
 
   - 
    
     
    
    
         "Response Headers": "响应头",
     
    
 
   - 
    
     
    
    
         "Hide Response": "隐藏响应",
     
    
 
   - 
    
     
    
    
         "Headers": "头",
     
    
 
   - 
    
     
    
    
         "Try it out!": "试一下!",
     
    
 
   - 
    
     
    
    
         "Show/Hide": "显示/隐藏",
     
    
 
   - 
    
     
    
    
         "List Operations": "显示操作",
     
    
 
   - 
    
     
    
    
         "Expand Operations": "展开操作",
     
    
 
   - 
    
     
    
    
         "Raw": "原始",
     
    
 
   - 
    
     
    
    
         "can't parse JSON. Raw result": "无法解析 JSON。原始结果",
     
    
 
   - 
    
     
    
    
         "Model Schema": "模型架构",
     
    
 
   - 
    
     
    
    
         "Model": "模型",
     
    
 
   - 
    
     
    
    
         "apply": "应用",
     
    
 
   - 
    
     
    
    
         "Username": "用户名",
     
    
 
   - 
    
     
    
    
         "Password": "密码",
     
    
 
   - 
    
     
    
    
         "Terms of service": "服务条款",
     
    
 
   - 
    
     
    
    
         "Created by": "创建者",
     
    
 
   - 
    
     
    
    
         "See more at": "查看更多:",
     
    
 
   - 
    
     
    
    
         "Contact the developer": "联系开发者",
     
    
 
   - 
    
     
    
    
         "api version": "api 版本",
     
    
 
   - 
    
     
    
    
         "Response Content Type": "响应 Content Type",
     
    
 
   - 
    
     
    
    
         "fetching resource": "正在获取资源",
     
    
 
   - 
    
     
    
    
         "fetching resource list": "正在获取资源列表",
     
    
 
   - 
    
     
    
    
         "Explore": "浏览",
     
    
 
   - 
    
     
    
    
         "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
     
    
 
   - 
    
     
    
    
         "Can't read from server. It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置 access-control-origin。",
     
    
 
   - 
    
     
    
    
         "Please specify the protocol for": "请指定协议:",
     
    
 
   - 
    
     
    
    
         "Can't read swagger JSON from": "无法读取 swagger JSON于",
     
    
 
   - 
    
     
    
    
         "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染 Swagger UI",
     
    
 
   - 
    
     
    
    
         "Unable to read api": "无法读取 api",
     
    
 
   - 
    
     
    
    
         "from path": "从路径",
     
    
 
   - 
    
     
    
    
         "server returned": "服务器返回"
     
    
 
   - 
    
     
    
    
     
      });
     
    
 
   - 
    
     
    
    
     
      $(function () {
     
    
 
   - 
    
     
    
    
         window.SwaggerTranslator.translate();
     
    
 
   - 
    
     
    
    
         window.SwaggerTranslator.setControllerSummary();
     
    
 
   - 
    
     
    
    
     
      });
     
    
 
  
 
 
3.将swagger.js设置成嵌入式资源

4.SwaggerConfig.cs文件里更改配置
  
   - 
    
     
    
    
     
      GlobalConfiguration.Configuration
     
    
 
   - 
    
     
    
    
     
          .EnableSwagger(c =>
     
    
 
   - 
    
     
    
    
     
              {
     
    
 
   - 
    
     
    
    
     
                  c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, System.String.Format(@"{0}\bin\YFAPICommon.XML", System.AppDomain.CurrentDomain.BaseDirectory)));
     
    
 
   - 
    
     
    
    
     
              })
     
    
 
   - 
    
     
    
    
     
              .EnableSwaggerUi(c =>
     
    
 
   - 
    
     
    
    
     
                  {
     
    
 
   - 
    
     
    
    
     
                      c.InjectJavaScript(System.Reflection.Assembly.GetExecutingAssembly(), "YFAPICommon.swagger.js");
     
    
 
   - 
    
     
    
    
     
                  });
     
    
 
  
 
效果:

文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。
原文链接:zzzili.blog.csdn.net/article/details/124445199
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)