C#Swagger的创建和使用
发布日期:2025-04-12 17:51 点击次数:124
C# 中 swagger
Swagger的介绍在C#如何安装Swagger
Swagger的介绍
上一篇:没有了
下一篇:没有了
Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过 Swagger 进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger 消除了调用服务时可能会有的猜测。 Swagger 的优势 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。 提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。
在C#如何安装Swagger1.打开VS软件找到工具
图片
然后输入Swagger图片
然后找到Swashbuckle并安装图片
安装了之后再找到Swagger.NET.UI并安装图片
2.安装好了之后会在App_Start下生成一个SwaggerConfig的类,我们找到这个类并打开图片
找到方法Register修改并替换图片
XML这里填写成自己的图片
找到这个类并注释图片
现在基本上就大功告成了!!! 运行项目输入http://localhost:51462/swagger/ 就可以了图片
这里有几个坑要注意一下,不要选择SwaggerUI下面的index运行这样也会报错, 需要自己输入生成的地址http://localhost:自己的端口号/swagger/就可以了 这样完成了之后但是 我们方法没有注释,不支持注释怎么办呢图片
找到App_Start文件夹并创建SwaggerCacheProvider辅助类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; } }
这个类的大概意思就是找到我们之前生成的XML并加载然后找到我们添加的注释内容并生成对应参数返回给前台 所以我们还需要添加一个js
图片
找到文件夹Scripts添加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' 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(); });
这里的js添加完成注意一点这里要设成嵌入资源
图片
设置完成之后,我们下一步肯定要注册这个资源,于是我们又要回到之前的SwaggerConfig上面
public static void Register() { //var thisAssembly = typeof(SwaggerConfig).Assembly; 获取项目文件路径 //var baseDirectory = AppDomain.CurrentDomain.BaseDirectory + @'\App_Data\'; //var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + '.XML'; //var commentsFile = Path.Combine(baseDirectory, commentsFileName); GlobalConfiguration.Configuration .EnableSwagger(c => { //用于启用和设置Swagger的配置信息。 c.SingleApiVersion('v2', '测试 API 接口文档'); c.IncludeXmlComments($@'{System.AppDomain.CurrentDomain.BaseDirectory}\bin\TestSwaggerList.xml'); //获取项目指定路径下xml文件 c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, $@'{System.AppDomain.CurrentDomain.BaseDirectory}\bin\TestSwaggerList.xml')); }) .EnableSwaggerUi(c => { //用于启用UI界面上的东西。 //加载汉化的js文件,注意 swagger.js文件属性必须设置为“嵌入的资源”。 APIUI.Scripts.swagger.js依次是:项目名称->文件夹->js文件名 c.InjectJavaScript(Assembly.GetExecutingAssembly(), 'TestSwaggerList.Scripts.swagger.js'); }); }
图片
现在我们就去方法写个注释试试吧图片
然后运行项目图片
这样就算大功告成了,当然里面有可能有其他特殊异常没有处理,比如多个方法同名怎么办????希望大家一起分享一同进步,谢谢大家 demo下载地址:swagger 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。