我在ASP.Net Core(版本1.1.2)中构建了一个Web API,我使用Swashbuckle.AspNetCore来生成swagger定义。
下面的是自动生成的swagger定义的一部分。我想更改路径,使其不包含 / api / ApiName ,但它将包含在 basePath 中,现在 / < / p>
{
"swagger": "2.0",
"info": {
"version": "v1",
"title": "ApiName.V1"
},
"host": "ApiUrl",
"basePath": "/api/ApiName",
"paths": {
"/": {
"get": {
"tags": [
"ApiName"
],
.........
所以我想得到的是:
{
"swagger": "2.0",
"info": {
"version": "v1",
"title": "ApiName.V1"
},
"host": "ApiUrl",
"basePath": "/",
"paths": {
"/api/ApiName": {
"get": {
"tags": [
"ApiName"
],
.........
我们有一些其他的API没有用.Net Core编写,并且它通过添加默认路由修复了同样的问题。我尝试通过删除API控制器顶部的路由
在.Net核心上做同样的事情[Route("api/[Controller]")]
并将其添加到Startup.cs。但是这没用。有没有人知道如何解决这个问题?
答案 0 :(得分:9)
最后我用它来修复它:
您可以设置PreSerializeFilters以添加BasePath并编辑路径。以为会有一种更优雅的方式,但这很有效。
var basepath = "/api/AppStatus";
c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.BasePath = basepath);
c.PreSerializeFilters.Add((swaggerDoc, httpReq) => {
IDictionary<string, PathItem> paths = new Dictionary<string, PathItem>();
foreach (var path in swaggerDoc.Paths)
{
paths.Add(path.Key.Replace(basepath, "/"), path.Value);
}
swaggerDoc.Paths = paths;
});
答案 1 :(得分:6)
在Swagger v2.0中使用了BasePath 它已由OpenApi v3.0
中的服务器阵列代替在v5中,您必须使用OpenApi v3.0来做到这一点:
var basePath = "/v1";
app.UseSwagger(c =>
{
c.RouteTemplate = "swagger/{documentName}/swagger.json";
c.PreSerializeFilters.Add((swaggerDoc, httpReq) =>
{
swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}{basePath}" } };
});
});
答案 2 :(得分:1)
使用 IDocumentFilter ,您可以修改结果swagger定义。
我在这里有一些例子: