第一步:引用程序集
打开NuGet程序包管理器,搜索Swagger,安装第一个,注意画圈的地方,
已经包含主程序和UI了,安装完成后会在根目录App_Start文件夹下生成SwaggerConfig.cs。
第二步:配置信息
按照如下配置即可,注意命名空间。
1 using System.Web.Http; 2 using WebActivatorEx; 3 using Demo.API; 4 using Swashbuckle.Application; 5 using Swashbuckle.Swagger; 6 using System; 7 using System.Collections.Concurrent; 8 using System.Collections.Generic; 9 using System.Xml; 10 using System.IO; 11 12 [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")] 13 14 namespace Demo.API 15 { 16 public class SwaggerConfig 17 { 18 public static void Register() 19 { 20 var thisAssembly = typeof(SwaggerConfig).Assembly; 21 22 GlobalConfiguration.Configuration 23 .EnableSwagger(c => 24 { 25 c.SingleApiVersion("v1", "Demo.API"); 26 c.IncludeXmlComments(System.AppDomain.CurrentDomain.BaseDirectory + "/bin/Demo.API.XML"); 27 c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider)); 28 }) 29 .EnableSwaggerUi(c => 30 { 31 //路径规则,项目命名空间.文件夹名称.js文件名称 32 c.InjectJavaScript(thisAssembly, "Demo.API.Scripts.swagger.js"); 33 }); 34 } 35 } 36 37 public class CachingSwaggerProvider : ISwaggerProvider 38 { 39 private static ConcurrentDictionary<string, SwaggerDocument> _cache = 40 new ConcurrentDictionary<string, SwaggerDocument>(); 41 42 private readonly ISwaggerProvider _swaggerProvider; 43 44 public CachingSwaggerProvider(ISwaggerProvider swaggerProvider) 45 { 46 _swaggerProvider = swaggerProvider; 47 } 48 49 public SwaggerDocument GetSwagger(string rootUrl, string apiVersion) 50 { 51 var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion); 52 SwaggerDocument srcDoc = null; 53 //只读取一次 54 if (!_cache.TryGetValue(cacheKey, out srcDoc)) 55 { 56 srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion); 57 58 srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } }; 59 _cache.TryAdd(cacheKey, srcDoc); 60 } 61 return srcDoc; 62 } 63 64 /// <summary> 65 /// 从API文档中读取控制器描述 66 /// </summary> 67 /// <returns>所有控制器描述</returns> 68 public static ConcurrentDictionary<string, string> GetControllerDesc() 69 { 70 string xmlpath = string.Format("{0}/bin/Demo.API.XML", System.AppDomain.CurrentDomain.BaseDirectory); 71 ConcurrentDictionary<string, string> dic = new ConcurrentDictionary<string, string>(); 72 if (!File.Exists(xmlpath)) 73 { 74 return dic; 75 } 76 XmlDocument doc = new XmlDocument(); 77 doc.Load(xmlpath); 78 XmlNodeList list = doc.SelectNodes("//member[contains(@name,‘T:‘)]"); 79 foreach (XmlNode item in list) 80 { 81 string val = item.Attributes["name"].Value; 82 string key = val.Substring(val.LastIndexOf(‘.‘) + 1).Replace("Controller", ""); 83 XmlNode node = item.FirstChild; 84 if (!dic.ContainsKey(key)) 85 { 86 dic.TryAdd(key, node.InnerText.Trim()); 87 } 88 } 89 return dic; 90 } 91 92 } 93 }
第三步:输出XML文件
右键项目的属性,生成,勾选
第四步:显示控制器备注
自己建一个js文件,然后在SwaggerConfig.cs中加入,如上面代码中的
c.InjectJavaScript(thisAssembly, "Demo.API.Scripts.swagger.js");
$(function () { var init = function () { $.getJSON($("#input_baseUrl").val(), {}, function (res) { $("#resources_container .resource").each(function (i, item) { var _id = $(item).attr("id"); if (!_id) { return; } var strSummary = res.ControllerDesc[_id.substring(9)]; if (strSummary) { $(item).children(".heading").children(".options").prepend(‘<li style="color:#000">‘ + strSummary + ‘</li>‘); } }); }); }; init(); });
自己加的js、css等文件啊,需要设置,否则会报错
选中文件,右键属性,生成操作改为嵌入的资源。
汉化就不需要了,你备注是中文就行,也没几个单词。
访问地址为 域名或IP+/swagger/ui/index
时间: 2024-10-06 18:06:09