Are you using .NET Core 3+? You may want to follow this guide instead Using Swagger In .NET Core 3+
Swagger is an auto-magically generated API documenting tool. It takes any standard Web API project and can generate amazing looking (And functioning) docs without a user having to write a single additional line of documentation. Best of all, it can be as simple as a 2 line setup, or as complex as adding additional info to every single API endpoint to explode the level of info inside Swagger.
Getting Started
For the purpose of this guide, I’m just going to be using the standard ASP.net Core Web API template when you create a new project from Visual Studio. But any existing API will work just fine too!
First off, install the following Nuget package from your package manager console.
Install-Package Swashbuckle.AspNetCore
Next in the ConfigureServices method of your startup.cs, add the following code to add the Swagger services to your application.
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSwaggerGen(swagger => { swagger.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Title = "My First Swagger" }); }); }
A couple of things to note here, firstly that inside the SwaggerGen lambda you can actually specify a few more details. As an example :
services.AddSwaggerGen(swagger => { swagger.DescribeAllEnumsAsStrings(); swagger.DescribeAllParametersInCamelCase(); swagger.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Title = "My First Swagger" }); });
Here we have said for any enum instead of using the integer value, use the string. And for all parameters can we please use CamelCase. The defaults usually suit most, but if there are specific things you are looking for your docs, you can probably find the setting here.
Secondly is obviously the Info object. Here you can specify things like the documentation author, title, and license among other things.
Head down to the Configure method of your Startup.cs.Add a call to “UseSwagger” and a call to “UseSwaggerUI” Both of these should come before the call to UseMVC.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My First Swagger"); }); app.UseMvc(); }
And that’s it! Navigate your browser to https://localhost:{yourport}/swagger to view your new API documentation.
If you don’t see anything, or it looks a bit odd, jump to the end of this article for a quick trouble shooting session!
XML Comments
The documentation that is auto generated is usually pretty damn good and if you are building a restful API, is usually enough to explain the functions of your API on their own. But there are times when the API needs a bit more explaining. For that, you can use XML Comments on your API action. For example :
/// <summary> /// Gets a value by ID. /// </summary> /// <param name="id">The id of the value you wish to get.</param> /// <returns></returns> [HttpGet("{id}")] public string Get(int id) { return "value"; }
If you are using Visual Studio, you can type three forward slashes in a row and it will auto generate a skeleton set of comments for you. Most importantly is the summary and parameter descriptions that are free text. They are invaluable for being able to explain what an endpoint does and what input it expects.
Next you need to force your application to actually generate the XML data that Swagger can then read. Right click on your project in Visual Studio and select Properties. On the panel that opens up, select “Build” on the left hand side. You should see an option for “Output”, and a checkbox for “Xml documentation file”. Tick this box and the setting will be auto filled out for you.
Note that this setting is per build configuration. If you intend to use Swagger remotely (And therefore likely be built in Release mode before deploying), then you should change the Configuration setting up top on this panel to “Release” and then retick the documentation tickbox.
If you are not using Visual Studio, or you are just interested in how things work behind the scenes. Doing all of this just adds the following line to your csproj file.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <DocumentationFile>bin\Debug\netcoreapp2.0\SwaggerExample.xml</DocumentationFile> </PropertyGroup>
Next you need to head back to the ConfigureServices method of your startup.cs and add a call to IncludeXmlComments in your Swagger configuration.
services.AddSwaggerGen(swagger => { swagger.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Title = "My First Swagger", Version = "v1" }); swagger.IncludeXmlComments(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "SwaggerExample.xml")); });
Where SwaggerExample.xml is the xml file you set in your csproj/project configuration.
When you view Swagger again you should now see your XML comments displayed inside the documentation.
Up the top right is our description of our endpoint. And in the id row for our parameters, we also have a description value.
Describing API Response Codes
There may be times where your API returns a non “200” response code that you want to provide documentation for. For example an error of 400 if a particular parameter doesn’t fit certain requirements.
The first step is to decorate your actions with a “Produces” attribute that describes all the possible return codes your endpoint will give out. At the same time you can describe that for a given code, what model you will be returning at the same time. So for example if when you return an error 400, you return a particular class that describes the error, you can define that here.
[HttpGet("{id}")] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(404)] [ProducesResponseType(400)] public string Get(int id) { return "value"; }
A quick note that you don’t need to specify the return of 200, that is implied, but it’s nice to add anyway. When you view this endpoint in swagger, the non 200 return codes are displayed at the bottom of the endpoint description.
While this lets you know that certain responses are expected, it doesn’t actually give you the reason why they would be returned. For that, we turn again to XML comments.
/// <summary> /// Gets a value by ID. /// </summary> /// <param name="id">The id of the value you wish to get.</param> /// <returns></returns> /// <response code="200">Value returned</response> /// <response code="404">Value was not able to be found</response> /// <response code="400">Id was below 0</response> [HttpGet("{id}")] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(404)] [ProducesResponseType(400)] public string Get(int id) { return "value"; }
Now when we view this endpoint in Swagger again we have the descriptions next to the response codes.
Troubleshooting
I can’t see anything
Check that the nuget package Microsoft.AspNetCore.StaticFiles is installed in the project. This is required by Swagger to run. If you are unsure, just try installing the package again, this has seriously fixed the issue for me before.
I’m using MVC Core
If you are use the “MVCCore” service rather than just plain MVC. Then you need to explicitly add the API Explorer services. Confused? Head to your ConfigureServices method in your startup.cs. If you see this :
services.AddMvc();
Then you are fine. However if you see this :
services.AddMvcCore();
Then you need to manually add the ApiExplorer service.
services.AddMvcCore().AddApiExplorer();
I’m not using “Attribute Routing”
Then Swagger won’t work for you. You must be using attribute routing to use Swagger.
When I type http://localhost//swagger, becaus this is my way to acces my API, when I type that i get a page called SwaggerUI but there is just a big text, this is the text:
500 : Error detallado de IIS 10.0 - 500.24 - Internal Server Error..... %SystemRoot%\system32\inetsrv\appcmd set app "Default Web Site/" /applicationPool:"Classic .NET AppPool"
I should do any additional step or something?
Hi Marc,
I chopped down your original error message as it was huge 🙂
What I can see is that you are running your app under IIS with a .NET app pool. Is your project a .NET Core project? And if it is, it should be running under an app pool that isn’t managed. Can you try that?
Hi,
any idea on how to set “/swagger” the landing route when launch the debug session?
(otherwise it goes on “api/Values” by default)
I tried to add routes.MapRoute(“swagger_root”, “”, “swagger”) and similar, unsuccessfully.
Alex
Hi Alex,
To change the URL that is launched when debugging, head to your project folder. Inside there there should be another folder called Properties, then a file called “launchsettings.json”. Find this line :
"launchUrl": "api/values",
And change it to the URL you want to launch when debugging.
This line fix my problem on .Net Core2.1:
The swagger page was working,but there was no any comment or summary.
Thank you.