Swagger使用教程 SwashbuckleEx
一、前言
自从之前写了一篇《Webapi文档描述-swagger优化》这篇文章后,欠了大家一篇使用文档的说明,现在给大家补上哈。
二、环境
- .Net Framework 4.5
- WebApi 2
- SwashbuckleEx 1.1.2:个人修改后的版本
三、SwashbuclkeEx 优化说明
- 汉化:支持中、英文。
- 接口搜索:模块名、注释名、接口名
- 注释:控制器备注、开发进度说明、开发人员注释
- 区域文档分组:支持多种文档切换、并分组显示在左侧,可通过点击进行切换文档
- 接口数量统计
展示如下:



三、SwashbuckleEx 使用文档
4.1 安装SwashbuckleEx
Install-Package SwashbuckleEx
4.2 包含指定XML注释文件
- 设置库生成Xml文件:右键点击
项目属性->生成->输出勾选Xml文档文件

- 配置注释文件:
IncludeXmlComments('绝对路径'),可配置多个,但是发布服务器的时候需要将XML带上,如果没有则会访问报错。
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.IncludeXmlComments(string.Format("{0}/bin/SwashbuckleEx.WebApiTest.XML", AppDomain.CurrentDomain.BaseDirectory));
}
4.3 简单Api文档信息配置-单文档
- 配置Api版本信息:
SingleApiVersion('版本','文档标题') - 配置联系方式:
Contarct- 邮箱:
Email - 创建人:
Name - 联系地址:
Url
- 邮箱:
- 配置许可证:
Lincese- 许可证名称:
Name - 地址:
Url
- 许可证名称:
- 配置备注:
Description('自定义内容') - 配置服务条款:
TermsOfService('条款内容')。这个方法没看到在界面哪个地方展示。
配置代码如下:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "Test.WebApi").Contact(x =>
{
x.Email("jianxuanhuo1@126.com");
x.Name("jian玄冰");
x.Url("https://www.cnblogs.com/jianxuanbing");
}).TermsOfService("jian玄冰").License(x =>
{
x.Name("MIT");
x.Url("https://www.cnblogs.com/jianxuanbing");
}).Description("自定义文案内容,可以随便输入内容");
}
效果图如下:

4.4 多版本Api文档信息配置-多文档
该方式主要用于API版本处理使用,但是本人用区域进行划分,用于分隔多个系统的接口。
- 路由配置:WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "AdminApi",
routeTemplate: "api/Admin/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Areas.Admin.Controllers" } });
config.Routes.MapHttpRoute(
name: "ClientApi",
routeTemplate: "api/Client/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Areas.Client.Controllers" } });
config.Routes.MapHttpRoute(
name: "CommonApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional, namespaces = new string[] { "SwashbuckleEx.WebApiTest.Controllers" } }
);
}
}
- 配置Api版本信息:
MultipleApiVersions()
Version进行了修改,提供支持默认路由
public static void Register()
{
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.MultipleApiVersions(ResolveAreasSupportByRouteConstraint, (vc) =>
{
vc.Version("Admin", "中文后台 API").Description("这个用于测试一下备注信息").TermsOfService("jian玄冰").License(
x =>
{
x.Name("jian玄冰");
x.Url("https://www.cnblogs.com/jianxuanbing");
})
.Contact(x =>
{
x.Name("2017").Email("jianxuanhuo1@126.com").Url("www.baidu.xxxx");
});
vc.Version("v1", "Common API", true);// 设置为默认路由
vc.Version("Client", "Client API");
});
// 添加区域路由文档过滤
c.DocumentFilter<AddAreasSupportDocumentFilter>();
}
}
// 处理默认路由以及区域路由问题
private static bool ResolveAreasSupportByRouteConstraint(ApiDescription apiDescription, string targetApiVersion)
{
if (targetApiVersion == "v1")
{
return apiDescription.Route.RouteTemplate.StartsWith("api/{controller}");
}
var routeTemplateStart = "api/" + targetApiVersion;
return apiDescription.Route.RouteTemplate.StartsWith(routeTemplateStart);
}
4.5 区域文档过滤
用于区分每个区域内文档切换问题,仅供参考,因为里面调整的内容与命名空间.相关。
/// <summary>
/// 添加 Area 文档过滤器
/// </summary>
public class AddAreasSupportDocumentFilter:IDocumentFilter
{
/// <summary>
/// 配置
/// </summary>
private readonly SwaggerConfiguration _config = ConfigProvider.Default.GetConfiguration<SwaggerConfiguration>();
/// <summary>
/// 重写Apply方法,加入Area文档处理
/// </summary>
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
IDictionary<string,PathItem> replacePaths=new ConcurrentDictionary<string, PathItem>();
foreach (var item in swaggerDoc.paths)
{
// api/Areas/Namespace.Controller/Action
string key = item.Key;
if (key.Contains(_config.JwtRoute))
{
replacePaths.Add(item.Key,item.Value);
continue;
}
var value = item.Value;
var keys = key.Split('/');
// Areas路由:keys[0]:"",keys[1]:api,keys[2]:Areas,keys[3]:{ProjectName}.Api.Areas.{AreaName}.Controllers.{ControllerName}Controller,keys[4]:{ActionName}
if (keys[3].IndexOf('.') != -1)
{
// 区域路径
string areaName = keys[2];
string namespaceFullName = keys[3];
var directoryNames = namespaceFullName.Split('.');
string namespaceName = directoryNames[3];
if (areaName.Equals(namespaceName, StringComparison.OrdinalIgnoreCase))
{
string controllerName = directoryNames[5];
replacePaths.Add(
item.Key.Replace(namespaceFullName,
controllerName.Substring(0,
controllerName.Length - DefaultHttpControllerSelector.ControllerSuffix.Length)),
value);
}
}
// 通用路由:keys[0]:"",keys[1]:api,keys[2]:{ProjectName}.Api.Controllers.{ControllerName}Controller,keys[3]:{ActionName}
else if (keys[2].IndexOf('.') != -1)
{
// 基础路径
string namespaceFullName = keys[2];
var directoryNames = namespaceFullName.Split('.');
bool isControllers = directoryNames[2].Equals("Controllers", StringComparison.OrdinalIgnoreCase);
string controllerName = directoryNames[3];
if (isControllers)
{
replacePaths.Add(
item.Key.Replace(namespaceFullName,
controllerName.Substring(0,
controllerName.Length - DefaultHttpControllerSelector.ControllerSuffix.Length)), value);
}
}
swaggerDoc.paths = replacePaths;
}
}
}
4.6 显示上传文件参数
SwaggerUI 有上传文件的功能,与添加自定义HTTP Header做法相类似,我们可以通过特性来标识API是否具有上传功能。
/// <summary>
/// 添加 上传操作过滤
/// </summary>
public class AddUploadOperationFilter:IOperationFilter
{
/// <summary>
/// 重写Apply方法,加入Upload操作过滤
/// </summary>
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var upload = apiDescription.ActionDescriptor.GetCustomAttributes<UploadAttribute>().FirstOrDefault();
if (upload == null)
{
return;
}
operation.consumes.Add("application/form-data");
operation.parameters.Add(new Parameter()
{
name = upload.Name,
@in = "formData",
required = upload.Require,
type = "file",
description = upload.Description
});
}
}
/// <summary>
/// 上传属性,用于标识接口是否包含上传信息参数
/// </summary>
public class UploadAttribute:Attribute
{
/// <summary>
/// 参数名
/// </summary>
public string Name { get; set; } = "file";
/// <summary>
/// 是否必须包含文件
/// </summary>
public bool Require { get; set; } = true;
/// <summary>
/// 备注
/// </summary>
public string Description { get; set; } = "";
}
然后再SwaggerConfig.cs的EnableSwagger配置类添加一行操作过滤注册代码即可。
c.OperationFilter<AddUploadOperationFilter>();
效果图如下:

4.7 自定义接口备注内容
由于不想将一些跟接口名无关的信息放在接口名那里,那么这个时候可以将部分业务相关的注释放在<remarks></remarks>标签当中
/// <summary>
/// 获取后台Guid
/// </summary>
/// <remarks>
/// 测试一些内容,不想将无用的东西放在接口名称当中<br/>
/// 换行输出一下内容
/// </remarks>
/// <returns></returns>
[HttpGet]
[ApiAuthor(Name = "jian玄冰",Status = DevStatus.Wait,Time = "2018-04-28")]
public Guid GetGuid()
{
return Guid.NewGuid();
}
效果图如下:

4.8 设置接口开发信息
增加ApiAuthor特性,用于设置接口开发状态、开发人、完成时间等相关信息。
/// <summary>
/// 获取后台Guid
/// </summary>
/// <remarks>
/// 测试一些内容,不想将无用的东西放在接口名称当中<br/>
/// 换行输出一下内容
/// </remarks>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
[ApiAuthor(Name = "jian玄冰",Status = DevStatus.Wait,Time = "2018-04-28")]
public Guid GetGuid()
{
return Guid.NewGuid();
}
然后再SwaggerConfig.cs的EnableSwagger配置类添加一行启用代码即可。
c.ShowDeveloperInfo();
效果图如下:

4.9 自定义响应信息
使用SwaggerResponse特性,可用于生成自定义响应结果实体、状态码、响应信息备注等信息,多用于返回类型为HttpResponseMessage结果。
参数说明:
- 状态码:
StatusCode,用于设置返回成功状态的状态码 - 备注:
Description,用于设置响应类备注信息 - 类型:
Type,用于设置返回结果类型的实体。这是主要设置项,因为返回类型HttpResponseMessage无法解析出结果类型。
/// <summary>
/// 获取用户信息
/// </summary>
/// <returns></returns>
[HttpGet]
[SwaggerResponse(HttpStatusCode.OK,"自定义内容",Type = typeof(UserInfo))]
public HttpResponseMessage GetUserInfo()
{
return Request.CreateResponse(HttpStatusCode.OK, new UserInfo(), "application/json");
}
效果图如下:

五、源码地址
https://github.com/jianxuanbing/SwashbuckleEx
Swagger使用教程 SwashbuckleEx的更多相关文章
- Swagger入门教程
[译]5.41 Swagger tutorial 单击此处查看原文 更多概念参见:Implementing Swagger with your API docs 关于 Swagger Swagger能 ...
- Swagger入门教程(转)
[译]5.41 Swagger tutorial 单击此处查看原文 更多概念参见:Implementing Swagger with your API docs 关于 Swagger Swagger能 ...
- Swagger使用教程大全,从入门到精通
Swagger是遵守OpenAPI规范(OAS)的世界上最大的API框架开发工具,可在整个API生命周期内进行开发,从设计和文档到测试和部署.它提供了许多试用的工具来帮助开发者进行接口开发,如及时接口 ...
- Swagger UI及 Swagger editor教程 API文档搭配 Node使用
swagger ui 是一个在线文档生成和测试的利器,目前发现最好用的.为啥好用呢?打开 demo,支持API自动生成同步的在线文档些文档可用于项目内部API审核方便测试人员了解 API这些文档可作为 ...
- Asp.Net WebApi swagger使用教程
swagger简介 别名:丝袜哥 功能:用于生产api文档 swagger安装 Nuget搜索swagger,然后安装Swashbuckle swagger使用 生成api的xml文档 webapi项 ...
- Swagger UI教程 API 文档神器 搭配Node使用
ASP.NET Web API 使用Swagger生成在线帮助测试文档 Swagger 生成 ASP.NET Web API 前言 swagger ui是一个API在线文档生成和测试的利器,目前发现最 ...
- Swagger UI教程
文档源地址 http://www.68idc.cn/help/makewebs/qitaasks/20160621620667.html Swagger-UI本身只提供在线测试功能,要集成它还需要告诉 ...
- Spring Boot整合swagger使用教程
目录 Swagger的介绍 优点与缺点 添加swagger 1.添加依赖包: 2.配置Swagger: 3.测试 场景: 定义接口组 定义接口 定义接口请求参数 场景一:请求参数是实体类. 场景二:请 ...
- Swagger简明教程
一.什么是swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法, ...
随机推荐
- 使用Svn的版本号[转载]
1. 生成一个名为autover的项目 注意项目的Properties文件夹下有一个名为AssemblyInfo.cs的文件,autover程序的版本号就写在它里面. 2. 创建模板文件 在Windo ...
- 一口一口吃掉Hexo(四)
如果你想得到更好的阅读效果,请访问我的个人网站 ,版权所有,未经许可不得转载! 人总是不会满足于现状,接下来我们就可以让我们的朋友们通过独立域名访问我们的网站了,但是这肯定是要花点钱的,所以这篇文章难 ...
- JLS中表达式的所有文法
3.8. Identifiers Identifier: IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral Iden ...
- ElasticSearch 基础<转载>
使用curl命令操作elasticsearch 大岩不灿 发表于 2015年4月25日 浏览 13,463 次 第一:_cat系列_cat系列提供了一系列查询elasticsearch集群状态的接口. ...
- ABP框架服务层的接口与实现(增删改查)
public interface ITaskAppService : IApplicationService { IList<TaskDto> GetAllTasks();//所有 Get ...
- 数据绑定到ADO.NET
// Define a DataSet with a single DataTable. DataSet dsInternal = new DataSet(); dsInternal.Tables.Ad ...
- OSI与TCP/IP模型
1 OSI参考模型 谈到网络不能不谈OSI参考模型,虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,也为我们学习网络协议提供了一个很好的参考.在现实网络世界里,T ...
- Centos下安装最新版Mono并为windwos服务配置开机启动项
一:安装Mono,此步骤参照官网 1:配置Yum仓库 #Centos 7yum install yum-utils rpm --import "http://keyserver.ubuntu ...
- Spring配置文件引入xml文件: <import resource=" " />标签使用总结
引入其他模块XML 在Spring的配置文件,有时候为了分模块的更加清晰的进行相关实体类的配置. 比如现在有一个job-timer.xml的配置 <?xml version="1.0& ...
- Spring报错:Exception in thread "main" java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source)
简单搭建了一个Spring Maven工程就报错: 看到网上说是JDK 7 和 Spring3.x :JDK编译级别设置成1.7,仍然没有得到解决,采用版本为 3.2.0.RELEASE <b ...