How to set base path property in swagger for .Net

2019-02-15 04:38发布

问题:

i've built a Web API in ASP.Net Core (version 1.1.2) and i use the Swashbuckle.AspNetCore for generating the swagger definition.

below is a part of the automatically generated swagger definition. i would like to change the paths so it does not include /api/ApiName but it would be included in the basePath which is now /

{
    "swagger": "2.0",
    "info": {
        "version": "v1",
        "title": "ApiName.V1"
    },
    "host": "ApiUrl",
    "basePath": "/api/ApiName",
    "paths": {
        "/": {
            "get": {
                "tags": [
                    "ApiName"
                ],
                .........

so what i would like to get is:

{
    "swagger": "2.0",
    "info": {
        "version": "v1",
        "title": "ApiName.V1"
    },
    "host": "ApiUrl",
    "basePath": "/",
    "paths": {
        "/api/ApiName": {
            "get": {
                "tags": [
                    "ApiName"
                ],
                .........

We have some other APIs which are not written in .Net Core and there it fixed the same issue by adding default routes. I tried to do the same on .Net core by removing the route at the top of the API controller

[Route("api/[Controller]")]

and adding it to the Startup.cs. however this did not work. Does anyone have any idea on how to fix this?

回答1:

in the end i used this to fix it:

you can set the PreSerializeFilters to add both the BasePath and edit the Paths. Thought there would be a more elegant way but this works.

            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;
            });


回答2:

Use an IDocumentFilter with that you can modify the result swagger definition.
I have some examples here:

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