Although the correct answer is already submitted, I would like to provide an example. Assume you have added the Swashbuckle.AspNetCore package to your project, and have used it in Startup.Configure(…) like this:
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "My Web Service API V1");
options.RoutePrefix = "api/docs";
});
Having a test controller action endpoint like this:
[HttpGet]
public ActionResult GetAllItems()
{
if ((new Random()).Next() % 2 == 0)
{
return Ok(new string[] { "value1", "value2" });
}
else
{
return Problem(detail: "No Items Found, Don't Try Again!");
}
}
Will result in a swagger UI card/section like this (Run the project and navigate to /api/docs/index.html):

As you can see, there is no ‘metadata’ provided for the endpoint.
Now, update the endpoint to this:
[HttpGet]
[ProducesResponseType(typeof(IEnumerable<string>), 200)]
[ProducesResponseType(404)]
public ActionResult GetAllItems()
{
if ((new Random()).Next() % 2 == 0)
{
return Ok(new string[] { "value1", "value2" });
}
else
{
return Problem(detail: "No Items Found, Don't Try Again!");
}
}
This won’t change the behavior of your endpoint at all, but now the swagger page looks like this:

This is much nicer, because now the client can see what are the possible response status codes, and for each response status, what is the type/structure of the returned data.
Please note that although I have not defined the return type for 404, but ASP.NET Core (I’m using .NET 5) is smart enough to set the return type to ProblemDetails.
If this is the path you want to take, it’s a good idea to add the Web API Analyzer to your project, to receive some useful warnings.
p.s. I would also like to use options.DisplayOperationId(); in app.UseSwaggerUI(…) configuration. By doing so, swagger UI will display the name of the actual .NET method that is mapped to each endpoint. For example, the above endpoint is a GET to /api/sample but the actual .NET method is called GetAllItems()