0

Since I've published my API on Azure Web Services and Azure SQL Database I can't use my API locally, it runs but then Swagger says Failed to load API definition, I don't know if it has something to do with the connection string or something but I can't debug locally anymore and it's a big issue.

Here's my startup.cs code:

public class Startup
{
    public Startup(IConfiguration configuration,
                   IWebHostEnvironment env)
    {
        Configuration = configuration;
        Env = env;
    }

    public IConfiguration Configuration { get; }
    public IWebHostEnvironment Env { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //if (Env.IsDevelopment())
        //{
        //    services.AddPersistenceServicesDevelopment(Configuration);
        //}

        services.AddPersistenceServicesProduction(Configuration);
        services.AddApplicationServices();
        services.AddIdentityServices(Configuration);
        services.AddControllers()
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            }); ;
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("AppAPI", new OpenApiInfo
            {
                Title = "AppAPI",
                Version = "v1"
            });

            c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
            {
                Description = @"JWT Authorization header using the Bearer scheme. \r\n\r\n 
                  Enter 'Bearer' [space] and then your token in the text input below.
                  \r\n\r\nExample: 'Bearer 12345abcdef'",
                Name = "Authorization",
                In = ParameterLocation.Header,
                Type = SecuritySchemeType.ApiKey,
                Scheme = "Bearer"
            });

            c.AddSecurityRequirement(new OpenApiSecurityRequirement()
            {
                {
                    new OpenApiSecurityScheme
                    {
                    Reference = new OpenApiReference
                      {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"
                      },
                      Scheme = "oauth2",
                      Name = "Bearer",
                      In = ParameterLocation.Header,

                    },
                    new List<string>()
                }
            });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "AppAPI v1");
            });
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthentication();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Thank you so much !

Jimmy
  • 105
  • 15
  • Have you decorated your controller and action methods with http action verb attributes? – Harkirat singh Jul 09 '21 at 06:13
  • Hi @SachaPerson, Before publish the application to Azure web Service, whether the application debugger works well locally? – Zhi Lv Jul 12 '21 at 08:50
  • @Harkiratsingh yes – Jimmy Jul 12 '21 at 20:01
  • @ZhiLv the application was working fine before I published it and now swagger isn't working locally – Jimmy Jul 12 '21 at 20:01
  • Hi @SachaPerson, have you ever changed the application's `ASPNETCORE_ENVIRONMENT` (you could check the `launchSettings.json` file)? Because, from the Configure method, we can see that the swagger service is enabled in the Development environment. – Zhi Lv Jul 14 '21 at 08:13
  • @ZhiLv I don't think I did, I've found a way around it because when I run the app locally I can't use Swagger but I can use Postman so it's all good, thank you for your time and your help guys ! – Jimmy Jul 15 '21 at 21:49

1 Answers1

0

You need to decorate your action methods with http action verbs. Just make sure that every action method is decorated with http verb and unique route e.g

[HttpGet("products")]
 public IActionResult GetProducts()
 {
    //Some logic
    return OK();
 }
Harkirat singh
  • 599
  • 6
  • 19