C# (WebApi)整合 Swagger

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
{/// <summary>/// Swagger 配置信息/// </summary>public class SwaggerControllerDescProvider : 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 SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string xml){_swaggerProvider = swaggerProvider;_xml = xml;}/// <summary>/// GetSwagger/// </summary>/// <param name="rootUrl"></param>/// <param name="apiVersion"></param>/// <returns></returns>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;}}
}

同时在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('<li class="controller-summary" 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();
});

 并且把文件属性设置为:

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm服务器配置与内网穿透工具结合实现远程开发的解决方法

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

力扣随笔之颜色分类(中等75)

思路&#xff1a;定义两个指针划分left&#xff0c;right划分三个区域left左边是红色区域&#xff0c;right右边是蓝色区域&#xff0c;left和right之间是白色区域&#xff1b;定义一个遍历指针遍历整个数组&#xff0c;遇到红色与left所指位置数字交换&#xff0c;并将left自加…

Java IO缓冲流——字节缓冲流、字符缓冲流 IO流异常的处理(JDK7 JDK9)

缓冲流 缓冲流&#xff0c;也叫高效流&#xff0c;是对4个基本的FileXxx流的增强&#xff0c;所以也是4个流&#xff0c;按照数据类型分类&#xff1a; 字节缓冲流&#xff1a; BufferedInputStream&#xff0c;BufferedOutputStream字符缓冲流&#xff1a; BufferedReader&a…

暴雨服务器:科技创新构建高效、高质、可持续的新质生产力

1月31日&#xff0c;中共中央政治局就扎实推进高质量发展进行第十一次集体学习。会议指出&#xff0c;发展新质生产力是推动高质量发展的内在要求和重要着力点&#xff0c;并系统概括了新质生产力的总体定义、动力来源、基本内涵、核心标志以及发展思路。这其中&#xff0c;新质…

Python中的全局变量和局部变量有什么区别?

Python中的全局变量和局部变量有什么区别&#xff1f; 在Python编程中&#xff0c;变量的作用域是一个非常重要的概念。作用域决定了在代码的哪些部分可以访问或修改一个变量。全局变量和局部变量是两种主要的变量作用域类型。 全局变量 全局变量是在函数之外定义的变量&…

LeetCode 第41天 | 背包问题 二维数组 一维数组 416.分割等和子集 动态规划

46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实…

Vue性能优化的方法有哪些

一. 编码优化&#xff1a; 1.不要将所有的数据都放在data中&#xff0c;data中的数据都会增加getter和setter&#xff0c;会收集对应的 watcher&#xff0c;这样就会降低性能。 2. vue 在 v-for 时给每项元素绑定事件需要用事件代理&#xff0c;节约性能。 3.尽可能拆分组件…

2023最新简绘AI开源版支持MJ绘画,AI问答

应用介绍 本文来自&#xff1a;2023最新简绘AI开源版支持MJ绘画&#xff0c;AI问答 - 源码1688 简介&#xff1a; 简绘AI开源版&#xff0c;从闲鱼上买的&#xff0c;搭建教程如下 测试环境&#xff1a;NginxPHP7.4MySQL5.6 图片&#xff1a;

力扣300最长递增子序列

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…

STM32F4XX - CAN设置

can协议部分 - 逻辑信号和电平信号 先贴上CAN信号在物理信号线上的查分信号表示形式 显性电平&#xff1a; 电压差范围为1.5-2.5v。 对应的逻辑电平是0 隐性电平&#xff1a; 其他 对应的逻辑电平是1 为什么显性电平对应的逻辑电平值为0&#xff0c;而隐性电平对应的逻辑电平…

视频互动游戏如何暴打海王和舔狗

前言 前2篇文章回答了游戏的可取之处以及不可复制的地方还有对于这一类的情景互动游戏在2024年的发展预言。第三篇主要是回答在一篇中一个留言的读者问的问题“如何暴打海王和舔狗”&#xff0c;求同存异&#xff0c;希望能够跟更多的读者交流与互相学习。 海王和舔狗的特征 …

2023全新UI千月影视APP源码 | 前后端完美匹配、后端基于ThinkPHP框架

应用介绍 本文来自&#xff1a;2023全新UI千月影视APP源码 | 前后端完美匹配、后端基于ThinkPHP框架 - 源码1688 简介&#xff1a; 2023全新UI千月影视APP源码 | 前后端完美匹配、后端基于thinkphp框架 图片&#xff1a;

免费多域名证书,最多支持保护250个域名

随着企业规模扩大和多元化发展&#xff0c;拥有多个域名的需求变得普遍&#xff0c;此时&#xff0c;多域名SSL证书应运而生&#xff0c;并且这一类型的证书已经发展到能够安全地支持多达250个不同域名的加密需求。 多域名SSL证书&#xff0c;也称为SAN&#xff08;Subject Alt…

【前端素材】推荐优质后台管理系统Tiny平台模板(附源码)

一、需求分析 后台管理系统是一个重要的工具&#xff0c;用于管理和维护网站、应用程序或系统的正常运行。通过灵活的权限管理和各种功能模块的结合&#xff0c;后台管理系统能够有效地帮助管理员管理和控制系统&#xff0c;提高工作效率和系统安全性。 后台管理系统是一种用…

OSCP靶场--Slort

OSCP靶场–Slort 考点(1.php 远程文件包含 2.定时任务提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.178.53 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-24 04:37 EST Nmap scan report for 192.168.178.53 …

2024年华为OD机试真题-伐木工-Python-OD统一考试(C卷)

题目描述: 一根X米长的树木,伐木工切割成不同长度的木材后进行交易,交易价格为每根木头长度的乘积。规定切割后的每根木头长度都为正整数;也可以不切割,直接拿整根树木进行交易。请问伐木工如何尽量少的切割,才能使收益最大化? 输入描述: 木材的长度(X<=50) 输出描…

二手旧物回收系统开发:推动可持续发展的关键

随着人们环保意识的增强&#xff0c;二手旧物回收系统的发展逐渐成为社会关注的焦点。开发二手旧物回收系统&#xff0c;不仅能有效减少废弃物的排放&#xff0c;降低对环境的污染&#xff0c;还能实现资源的循环利用&#xff0c;推动可持续发展。本文将深入探讨二手旧物回收系…

C#常识篇(一)

面向对象的三大特性 继承&#xff1a;子类通过继承父类来获取基础特性&#xff0c;并且能够基于父类进行扩展以及提升代码的复用性。继承具有传递性&#xff0c;例如A继承自B&#xff0c;C继承自A&#xff0c;那么C就间接继承自B。在C#中&#xff0c;每个类仅允许继承一个父类。…

java8新特性-Lambda

目录 一、Lambda 1、什么是Lambda表达式 2.Lambda表达式的基本语法&#xff1a; 3.参数列表 4.Lambda表达式使用前后对比 举例一&#xff1a; 举例二&#xff1a; 二、函数式接口 1.函数式接口的使用说明 2.4个基本的函数式接口 3.如何定义函数接口 1.保证接口中只…

Java:获取网络资源文件的文件大小

工具类代码 package com.example.util;import org.apache.commons.io.FileUtils;import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection;/…