Tyler Findlay
Tyler Findlay

Reputation: 637

Swagger Page is 404 Not Found in MVC net-core

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

Answers (8)

Foggy
Foggy

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

freedeveloper
freedeveloper

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

Anttoni
Anttoni

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

You can overcome this problem by adding the following code c.RoutePrefix = string.Empty; in app.UseSwaggerUI

Upvotes: 0

Leonardo Nomdedeu
Leonardo Nomdedeu

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

Eric Milliot-Martinez
Eric Milliot-Martinez

Reputation: 4596

I just deleted the .vs folder in the solution's root directory. Now it works...

Upvotes: 1

KingRaja
KingRaja

Reputation: 194

For me @Tyler Findlay solution didn't work out. But I did it in a different way that works fine for me.

  1. Recreate the project, ensure the checkbox Configure for HTTPS checked if API needs to be secured, based on this option some of the code of line will be added into startup.cs
  2. Install the Swashbuckle.AspNetCore.Swagger through Nuget.
  3. Install the Swashbuckle.AspNetCore.SwaggerGen & Swashbuckle.AspNetCore.SwaggerUI through Nuget. Remember the AspNetCore.Swagger internally install the SwaggerGen and UI, but you can add it through Nuget.
  4. Compile the Project and Run it.

Hope this will help somebody.

Update: the URL can be HTTP://localhost:/swagger/ui

Upvotes: 0

Tyler Findlay
Tyler Findlay

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

Related Questions