swagger
的目的简单来讲就是,不用为每一个接口手动写接口文档,由于它是根据接口自动生成的,接口更改时文档也同步更新,减小了手动更新的麻烦和遗漏。同时也提供了接口的调试等功能,你不用打开postman
等接口测试软件来测试接口;若是有写备注的话,接口、入参和输出都有详细的备注说明,调用接口的人也能更加直观的读懂接口。沟通效率和工做效率也会大大提高。web
Swagger
生成器:services.AddSwaggerGen()
.Swagger
公开为JSON
节点:app.UseSwagger()
Swagger-UI
中间件,将指定的swagger json
端点为其提供支持:app.UseSwaggerUI()
Package Manager : Install-Package Swashbuckle.AspNetCore 或 CLI : dotnet add package Swashbuckle.AspNetCore
若是mvc使用的是services.AddMvcCore()
,则须要手动添加ApiExplorer
,由于SwashBuckle
强烈依赖于ApiExplorer
,ApiExplorer
用来发现控制器中的接口方法。须要手动添加。如:
services.AddMvcCore().AddApiExplorer();
json
若是使用的是services.AddMvc()
,则不须要再进行注册。由于AddMvc()
中已经添加了ApiExplorer
。如:c#
public static IMvcBuilder AddMvc(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof (services)); IMvcCoreBuilder builder = services.AddMvcCore(); builder.AddApiExplorer();//在这里 builder.AddAuthorization(); MvcServiceCollectionExtensions.AddDefaultFrameworkParts(builder.PartManager); builder.AddFormatterMappings(); builder.AddViews(); builder.AddRazorViewEngine(); builder.AddRazorPages(); builder.AddCacheTagHelper(); builder.AddDataAnnotations(); builder.AddJsonFormatters(); builder.AddCors(); return (IMvcBuilder) new MvcBuilder(builder.Services, builder.PartManager); }
何时用AddMvc()
,何时用AddMvcCore()
呢?
经过AddMvc()
的方法中咱们应该能够发现,里面有添加View
、Razor
和TagHelper
服务,这些在WebApi项目中是用不到的。因此:
1).若是你的项目是mvc web程序,则使用AddMvc()
.
2).若是的项目是webapi,则使用AddMvcCore()
,而后酌情添加须要的其它服务;固然使用AddMvc()
也没有问题。api
services.AddSwaggerGen(options => { options.SwaggerDoc(AppDefaults.ApiDocumentName, new Info { Title = AppDefaults.ApiDocumentTitle, Description = AppDefaults.ApiDocumentDescription, Version = typeof(Startup).Assembly.GetName().Version.ToString() }); //加载注释文件 Directory.GetFiles(Environment.ContentRootPath, "*.xml", SearchOption.AllDirectories) .ToList() .ForEach(f => options.IncludeXmlComments(f)); });
//生成swagger-json文件,并重定义swagger-json文件路由模板,这里我修改了 swagger-json 的路由模板。 //若是不自定义的话,默认是 swagger/{documentName}/swagger.json app.UseSwagger(options => options.RouteTemplate = "{documentName}/swagger.json"); app.UseSwaggerUI(options => { //指定生成swagger-json文件路径,为SwaggerUI提供数据。 //若是上边路由模板没有自定义,则完成路径是 /swagger/{AppDefaults.ApiDocumentName}/swagger.json options.SwaggerEndpoint($"/{AppDefaults.ApiDocumentName}/swagger.json", AppDefaults.ApiDocumentName); //自定义SwaggerUI页面路由前缀 //地址栏输入 http://loacalhost:5000/lxp 就能够打开SwaggerUI页面 options.RoutePrefix = "lxp"; });
Swagger
中显示,全部控制器必须使用属性路由例如:mvc
[Route("[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet("name")] public async Task<ActionResult<string>> GetNameAsync([FromQuery] string name) { if (!string.IsNullOrEmpty(name)) { ModelState.TryAddModelError(nameof(name), $"{nameof(name)} can not be empty"); } if (!ModelState.IsValid) { return BadRequest(ModelState); } return await Task.FromResult(name); } }
AppDefaults
是我定义一个常量的类