如何在swagger中为.Net Core Web API设置基本路径属性

时间:2017-07-26 12:33:00

标签: asp.net asp.net-core swagger asp.net-core-webapi swashbuckle

我在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。但是这没用。有没有人知道如何解决这个问题?

3 个答案:

答案 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定义。
我在这里有一些例子:

https://github.com/heldersepu/SwashbuckleTest/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs#L285