'Can't read swagger JSON file on ASP.NET Core 1.2 Application after hosting into local IIS

After hosting my asp.net core 1.2 application, I am getting an error as:

swagger is unable to find the swagger.json file.

I have tried to solve the problem by giving a virtual path name app.UseSwaggerUI() but it's not working.

Edit to clarify question based on comments:

After hosting Asp.net core application in IIS, the swagger.json file is generating on localhost:<random_port>/swagger/v1/swagger.json path.

How do I serve the swagger.json file on a custom route like: localhost:<random_port>/virtualpathname/swagger/v1/swagger.json

I have tried to set a virtual path in app.UseSwaggerUI() like {virtualpathname}/swagger/v2/swagger.json but still it is not working



Solution 1:[1]

I suggest you to perform the two next steps.

Note: The first step is going to give you more details about the error you're facing.

Solution 2:[2]

In my case the issue was the virtual directory which I fixed by adding a relative path(../). In any case make sure you setup ConfigureServices first, then when Configure make sure everything is in order, UseSwagger should be before UseMvc and at the end UseSwaggerUI

public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.AddSwaggerGen(c => {
            c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Title = "Utility", Version = "v1" });
        });
        // initialize configuration
        var conf = new ConfigurationHelper(Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath);
        Configuration = conf.Configuration; // just in case
        // inject the RestApiWrapperService as singleton into the services configuration
        var restService = new RestApiWrapperService(conf);
        services.AddSingleton<IRestApiWrapperService>(restService);
    }


        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseSwagger();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            // app.UseMvc();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

            app.UseSwaggerUI(s => {
                s.RoutePrefix = "help";
                s.SwaggerEndpoint("../swagger/v1/swagger.json", "Utility");
                s.InjectStylesheet("../css/swagger.min.css");
            });

Solution 3:[3]

Change the following on your startup.cs class:

app.UseSwaggerUI(c =>
                {
                  c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyService.API v1");

                });

To

app.UseSwaggerUI(c =>
              {
                  c.SwaggerEndpoint("/MyWebsiteName/swagger/v1/swagger.json", 
                    "MyService.API v1");

              });

[MyWebsiteName] being the name of application configured in IIS.

Solution 4:[4]

I happened to have a simple copy paste mistake! see the first line in below code, the if statement env.IsDevelopment() is causing this section to not run when deployed to IIS. One option is to comment it out!


     //if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                    app.UseSwagger(c =>
                    {
                        c.RouteTemplate = "swagger/{documentName}/swagger.json";
                    });
                    app.UseSwaggerUI(c => {
                        c.RoutePrefix = "swagger";
                        c.SwaggerEndpoint("/swagger/v1/swagger.json", "StockOps.WebAPI v1");                                   
                    });                
                }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alan Silva
Solution 2 Sebastian Castaldi
Solution 3 msagas
Solution 4 g77