Reputation: 637
I have a brand new .NET-Core Web API project that I want to use API versioning and swagger.
When I try to view the swagger page I get a 404. However, the default ValuesController that comes with the template works.
Here is my setup:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Add API Versioning
services.AddApiVersioning(
options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
});
// Add Swagger
string pathToDoc = "RegistriesApi.xml";
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1",
new Info
{
Title = "Registries API",
Version = "v1",
Description = "A simple api to interact with AMA registries information",
TermsOfService = "None"
});
string filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, pathToDoc);
options.IncludeXmlComments(filePath);
options.DescribeAllEnumsAsStrings();
});
}
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Url Path Rewriter
RewriteOptions rewriteOptions = new RewriteOptions();
if (!env.IsDevelopment())
{
rewriteOptions.AddRedirectToHttps();
}
else
{
app.UseDeveloperExceptionPage();
}
app.UseRewriter(rewriteOptions);
// Use MVC
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
// Swagger
app.UseSwagger(c =>
{
c.PreSerializeFilters.Add((swagger, httpReq) => swagger.Host = httpReq.Host.Value);
});
app.UseSwaggerUI(
c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs"); });
}
ValuesController.cs
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/values")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new[] {"value1", "value2"};
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
Also, here is the version for all the libraries I have installed:
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="2.2.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="2.4.0" />
</ItemGroup>
Does anyone see what I might be doing wrong?
Upvotes: 11
Views: 41232
Reputation: 61
In my case I defined Authentication and Authorization with builder.Services.AddAuthentication
, builder.Services.AddAuthorization
, but forgot to add the usage of it app.UseAuthentication()
, app.UseAuthorization()
.
Upvotes: 0
Reputation: 4082
I resolved this problem after discovered that by error I forgot to add to the startup.cs file (or the equivalent that you are using for startup.cs in NET 6.0)
In the method Configure Add:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
Upvotes: 2
Reputation: 21
The combination from above answers worked for me:
app.UseSwaggerUI(c => {
c.RoutePrefix = string.Empty;
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Name of Your API v1");
});
Upvotes: 2
Reputation: 1
You can overcome this problem by adding the following code c.RoutePrefix = string.Empty;
in app.UseSwaggerUI
Upvotes: 0
Reputation: 861
Just in case, check your Configure() method in Startup.cs, you should add these lines if they are not present:
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Name of Your API v1"));
Upvotes: 0
Reputation: 4596
I just deleted the .vs
folder in the solution's root directory. Now it works...
Upvotes: 1
Reputation: 194
For me @Tyler Findlay solution didn't work out. But I did it in a different way that works fine for me.
Hope this will help somebody.
Update: the URL can be HTTP://localhost:/swagger/ui
Upvotes: 0
Reputation: 637
When I created the project, I accidentally included the .vs folder in check in. When I removed it from source control, for whatever reason swagger started working again.
Not sure that the explanation is for this.
Upvotes: 21