asp.net core 3.0中使用swagger的方法與問(wèn)題
Intro#
上次更新了 asp.net core 3.0 簡(jiǎn)單的記錄了一下 swagger 的使用,那個(gè)項(xiàng)目的 api 比較簡(jiǎn)單,都是匿名接口不涉及到認(rèn)證以及 api 版本控制,最近把另外一個(gè) api 項(xiàng)目升級(jí)到了 3.0,還是遇到了一些問(wèn)題,這里單獨(dú)寫一篇文章介紹,避免踩坑。
Swagger 基本使用#
swagger 服務(wù)注冊(cè):
services.AddSwaggerGen(option =>
{
option.SwaggerDoc("sparktodo", new OpenApiInfo
{
Version = "v1",
Title = "SparkTodo API",
Description = "API for SparkTodo",
Contact = new OpenApiContact() { Name = "WeihanLi", Email = "weihanli@outlook.com" }
});
// include document file
option.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{typeof(Startup).Assembly.GetName().Name}.xml"), true);
});
中間件配置:
//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint
app.UseSwaggerUI(option =>
{
option.SwaggerEndpoint("/swagger/sparktodo/swagger.json", "sparktodo Docs");
option.RoutePrefix = string.Empty;
option.DocumentTitle = "SparkTodo API";
});
為 Swagger 添加 Bearer Token 認(rèn)證#
services.AddSwaggerGen(option =>
{
// ...
// Add security definitions
option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
Description = "Please enter into field the word 'Bearer' followed by a space and the JWT value",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
});
option.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{ new OpenApiSecurityScheme
{
Reference = new OpenApiReference()
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
}, Array.Empty<string>() }
});
});
支持多個(gè) ApiVersion#
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = ApiVersion.Default;
options.ReportApiVersions = true;
});
services.AddSwaggerGen(option =>
{
// ...
option.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "API V1" });
option.SwaggerDoc("v2", new OpenApiInfo { Version = "v2", Title = "API V2" });
option.DocInclusionPredicate((docName, apiDesc) =>
{
var versions = apiDesc.CustomAttributes()
.OfType<ApiVersionAttribute>()
.SelectMany(attr => attr.Versions);
return versions.Any(v => $"v{v.ToString()}" == docName);
});
option.OperationFilter<RemoveVersionParameterOperationFilter>();
option.DocumentFilter<SetVersionInPathDocumentFilter>();
});
自定義 Api version 相關(guān)的 OperationFilter:
public class SetVersionInPathDocumentFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
var updatedPaths = new OpenApiPaths();
foreach (var entry in swaggerDoc.Paths)
{
updatedPaths.Add(
entry.Key.Replace("v{version}", swaggerDoc.Info.Version),
entry.Value);
}
swaggerDoc.Paths = updatedPaths;
}
}
public class RemoveVersionParameterOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
// Remove version parameter from all Operations
var versionParameter = operation.Parameters.Single(p => p.Name == "version");
operation.Parameters.Remove(versionParameter);
}
}
中間件配置:
//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint
app.UseSwaggerUI(option =>
{
option.SwaggerEndpoint("/swagger/v2/swagger.json", "V2 Docs");
option.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
option.RoutePrefix = string.Empty;
option.DocumentTitle = "SparkTodo API";
});
最終 swagger 效果


Memo#
上面的配置來(lái)自 https://github.com/WeihanLi/SparkTodo 這個(gè)項(xiàng)目,要獲取代碼可以參考這個(gè)項(xiàng)目
Reference#
- https://github.com/domaindrivendev/Swashbuckle.AspNetCore/tree/master/test/WebSites/MultipleVersions/Swagger
- https://stackoverflow.com/questions/58197244/swaggerui-with-netcore-3-0-bearer-token-authorization
- https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1295
- https://github.com/WeihanLi/SparkTodo
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
利用ASP.NET MVC+Bootstrap搭建個(gè)人博客之打造清新分頁(yè)Helper(三)
這篇文章主要介紹了利用ASP.NET MVC+Bootstrap搭建個(gè)人博客之打造清新分頁(yè)Helper(三)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
Asp.net調(diào)試的一些問(wèn)題小結(jié)
這篇文章主要介紹了asp.net調(diào)試方便的知識(shí)點(diǎn),在CSDN找了一些相關(guān)的解決方法,不敢獨(dú)享,供大家相互學(xué)習(xí)交流之用2013-11-11
Windows虛擬主機(jī)與VPS如何實(shí)現(xiàn)301重定向(asp.net)
301重定向應(yīng)該是研究SEO必須掌握的技術(shù)。如果你是剛接觸SEO的菜鳥,想了解什么是301重定向,請(qǐng)看《html實(shí)現(xiàn)301重定向的方法》一文,我在該篇隨筆中引用了Google網(wǎng)站站長(zhǎng)工具對(duì)301重定向的解釋2011-12-12
.net GridView分頁(yè)模板的實(shí)例代碼
.net GridView分頁(yè)模板的實(shí)例代碼,對(duì)分頁(yè)代碼有興趣的朋友可以參考一下2013-03-03
asp.net core webapi 服務(wù)端配置跨域的實(shí)例
下面小編就為大家分享一篇asp.net core webapi 服務(wù)端配置跨域的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
ASP.net百度主動(dòng)推送功能實(shí)現(xiàn)代碼
百度站長(zhǎng)工具的主動(dòng)推送功能,以最為快速的提交方式,推薦您將站點(diǎn)當(dāng)天新產(chǎn)出鏈接立即通過(guò)此方式推送給百度,以保證新鏈接可以及時(shí)被百度收錄2020-09-09
.NET?Core?Web?APi類庫(kù)內(nèi)嵌運(yùn)行的方法
這篇文章主要介紹了.NET?Core?Web?APi類庫(kù)內(nèi)嵌運(yùn)行的方法,本節(jié)我們重點(diǎn)討論如何內(nèi)嵌運(yùn)行.NET Core Web APi類庫(kù),同時(shí)介紹了兩種激活比如控制器特性方案,需要的朋友可以參考下2022-09-09

