SpringBoot-整合Swagger_jboot整合swagger-CSDN博客

C# webapi 也可以整合Swagger

webapi运行其实有个自带的HELP页面

但是如果觉得UI不好看,且没办法显示方法注释等不方便的操作,我们也可以整合Swagger

一、使用NuGet控制台安装Swagger

在菜单中选择工具->NuGet包管理器->程序包管理器控制台 输入指令

Install-Package Swashbuckle

安装成功就已经可以访问页面了

直接运行项目:IP地址:端口号+swagger/ui/index 即可浏览成功。但是会发现页面是英文的且注释无法显示。

二、配置Swagger 显示中文且显示注释

安装完Swagger会在App_Start文件夹下自动生成 SwaggerConfig.cs 更新它

using System.Web.Http;using WebActivatorEx;using TPGYWebAPI;using Swashbuckle.Application;using TPGYWebAPI.App_Start;using System.Linq;using System.Reflection;[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]namespace TPGYWebAPI{public class SwaggerConfig{public static void Register(){var thisAssembly = typeof(SwaggerConfig).Assembly; GlobalConfiguration.Configuration.EnableSwagger(c =>{c.SingleApiVersion("v1", "TPGYWebAPI");//添加下述代码 //注意这里的xml文件名要改成你自己的!!!! var xmlFile = string.Format("{0}/bin/TPGYWebAPI.XML", System.AppDomain.CurrentDomain.BaseDirectory);if (System.IO.File.Exists(xmlFile)){c.IncludeXmlComments(xmlFile);}c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());c.CustomProvider((defaultProvider) => new SwaggerControllerDescProvider(defaultProvider, xmlFile));}).EnableSwaggerUi(b => {//注意这里的路径 项目名要改成你自己的!!!b.InjectJavaScript(Assembly.GetExecutingAssembly(), "TPGYWebAPI.Scripts.SwaggerConfig.js");});}}}

并且在该文件夹下创建 SwaggerControllerDescProvider.cs

using Swashbuckle.Swagger;using System.Collections.Concurrent;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web;using System.Xml;namespace TPGYWebAPI.App_Start{/// /// Swagger 配置信息/// public class SwaggerControllerDescProvider : ISwaggerProvider{private readonly ISwaggerProvider _swaggerProvider;private static ConcurrentDictionary _cache = new ConcurrentDictionary();private readonly string _xml;/// /// /// /// /// xml文档路径public SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string xml){_swaggerProvider = swaggerProvider;_xml = xml;}/// /// GetSwagger/// /// /// /// 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 { { "ControllerDesc", GetControllerDesc() } };_cache.TryAdd(cacheKey, srcDoc);}return srcDoc;}/// /// 从API文档中读取控制器描述/// /// 所有控制器描述public ConcurrentDictionary GetControllerDesc(){string xmlpath = _xml;ConcurrentDictionary controllerDescDict = new ConcurrentDictionary();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;}}}

同时在Scripts下面新建SwaggerConfig.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('
  • ' + strSummary + '
  • ');}}});}});},_tryTranslate: function (word) {return this._words[$.trim(word)] !== undefined " />

    并且把文件属性设置为:

    同时还需要启用生成xml文档,右击项目文件属性->生成选项卡(勾选XML文件)。保存后,重新生成。如下图所示

    参考文章: 这两篇文章里面都有些瑕疵错误,我进行了修改。总结就是注意 路径问题ASP.NET WEB API 最全的Swagger 安装配置与使用(一) - 我是小柒 - 博客园 (cnblogs.com)

    Swagger使用方法详解(WebApi)——看完不会用你打我_webapi swagger-CSDN博客