Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

作用:

1.接口的文档在线自动生成。

2.功能测试。

二、安装Swagger 

1.nuget安装Swashbuckle和  .UI

ASP.NET WebApi项目框架搭建(二):Swagger

 2.修改App_Start下的SwaggerConfig.cs,如 api 版本号,title。

ASP.NET WebApi项目框架搭建(二):Swagger

 3.创建项目XML注释文档,右键项目→属性→生成→选中下方的 "XML文档文件" 然后保存

 ASP.NET WebApi项目框架搭建(二):Swagger

 4.配置启用

ASP.NET WebApi项目框架搭建(二):Swagger

5.给控制的方法加上注释

ASP.NET WebApi项目框架搭建(二):Swagger

 6.启动项目,地址:http://localhost:xxxx/swagger,显示如下

ASP.NET WebApi项目框架搭建(二):Swagger

 7.测试一下index2方法:

ASP.NET WebApi项目框架搭建(二):Swagger

二、汉化Swagger 

1.新建Swagger文件夹,定义一个provider实现ISwaggerProvider接口 包含了缓存 名:SwaggerCacheProvider

/// <summary>
    /// swagger显示控制器的描述
    /// </summary>
    public class SwaggerCacheProvider : ISwaggerProvider
    {
        private readonly ISwaggerProvider _swaggerProvider;
        private static ConcurrentDictionary<string, SwaggerDocument> _cache =new ConcurrentDictionary<string, SwaggerDocument>();
        private readonly string _xml;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="swaggerProvider"></param>
        /// <param name="xml">xml文档路径</param>
        public SwaggerCacheProvider(ISwaggerProvider swaggerProvider,string xml)
        {
            _swaggerProvider = swaggerProvider;
            _xml = xml;
        }

        public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
        {

            var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
            SwaggerDocument srcDoc = null;
            //只读取一次
            if (!_cache.TryGetValue(cacheKey, out 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()
        {
            string xmlpath = _xml;
            ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
            if (File.Exists(xmlpath))
            {
                XmlDocument xmldoc = new XmlDocument();
                xmldoc.Load(xmlpath);
                string type = string.Empty, path = string.Empty, controllerName = string.Empty;

                string[] arrPath;
                int length = -1, cCount = "Controller".Length;
                XmlNode summaryNode = null;
                foreach (XmlNode node in xmldoc.SelectNodes("//member"))
                {
                    type = node.Attributes["name"].Value;
                    if (type.StartsWith("T:"))
                    {
                        //控制器
                        arrPath = type.Split('.');
                        length = arrPath.Length;
                        controllerName = arrPath[length - 1];
                        if (controllerName.EndsWith("Controller"))
                        {
                            //获取控制器注释
                            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;
        }
    }
View Code

相关文章:

  • 2022-12-23
  • 2021-10-22
  • 2021-08-29
  • 2019-11-01
  • 2022-12-23
  • 2021-12-31
  • 2022-03-01
猜你喜欢
  • 2022-02-22
  • 2021-07-03
  • 2021-10-05
  • 2021-11-01
  • 2021-12-21
  • 2021-07-21
  • 2021-06-05
相关资源
相似解决方案