Is there a way change the Controller's name in the swagger-ui page?

帅比萌擦擦* 提交于 2019-12-10 01:00:44

问题


I'm using Swashbuckle to enable the use of swagger and swagger-ui in my WebApi project.

In the following image you can see two of my controllers shown in the swagger-ui page. These are named as they are in the C# code, however I was wondering if there was a way to change what is shown here?

This is mainly because as you can see ManagementDashboardWidget is not a user friendly name, so I want to change it to be user friendly.


回答1:


You can use tags for that. By default Swashbuckle adds a tag with the name of the controller to every operation. You can override that with the SwaggerOperationAttribute. For instance, the next line replaces the default tag, Values, with the tag Test:

public class ValuesController : ApiController
{
    [SwaggerOperation(Tags = new[] { "Test" })]
    public IHttpActionResult Get()
    {
        // ...
    }
}

The Getoperation will now be put in the group Test.

If you want the operation to appear in multiple groups you can add more tags. For instance:

[SwaggerOperation(Tags = new[] { "Test", "Release1" })]

will put the Get operation in the groups Test and Release1.




回答2:


I tried using venerik's answer, but it still kept the original controller name in the UI along with the new tag that you specify. I also didn't like that you had to add an attribute to every function, so I came up with a solution where you only have to add an attribute to the controller. There are two steps:

Add DisplayNameAttribute on the controller:

[DisplayName("Your New Tag")]
public class YourController : ApiController
{
    // ...
}

Then in the Swagger configuration, you can override the base functionality using the GroupActionsBy function to pull the name that you specified in that attribute:

GlobalConfiguration.Configuration
    .EnableSwagger(c => {

        c.GroupActionsBy(apiDesc => {
            var attr = apiDesc
                .GetControllerAndActionAttributes<DisplayNameAttribute>()
                .FirstOrDefault();

            // use controller name if the attribute isn't specified
            return attr?.DisplayName ?? apiDesc.ControllerName(); 
        });

    })
    .EnableSwaggerUi(c => {
        // your UI config here
    });



回答3:


If one wants to do this at a Controller / Class level, the following is a very useful extract from here

use the [ApiExplorerSettings(GroupName = "Group")] on your controllers

Then in Startup

services.AddSwaggerGen(options =>
{
options.SwaggerDoc(version,
    new Info
    {
        Title = name,
        Version = version
    }
);

options.DocInclusionPredicate((_, api) => !string.IsNullOrWhiteSpace(api.GroupName));

options.TagActionsBy(api => api.GroupName);
});

Also note that

5.0.0-beta of swashbuckle now includes an TagActionsBy overload that supports returning an array of tags. This should allow for the above customizations to be simplified



来源:https://stackoverflow.com/questions/37076173/is-there-a-way-change-the-controllers-name-in-the-swagger-ui-page

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!