IIS site within virtual directory Swagger UI end point

Viewed 14410

Swagger UI end point is not same as dev in staging ( excluding domain names)

IIS Configuration

enter image description here

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

 app.UseSwagger(c=>
        {
            //Change the path of the end point , should also update UI middle ware for this change                
            c.RouteTemplate = "api-docs/{documentName}/swagger.json";                 
        });          

        app.UseSwaggerUI(c =>
        {  
            //Include virtual directory if site is configured so
            c.SwaggerEndpoint(Configuration["Appsettings:VirtualDirectory"]+"api-docs/v1/swagger.json", "Api v1");                
        });

 services.AddSwaggerGen(c =>
        {
 var xmlDocPath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "Api.xml");
            c.IncludeXmlComments(xmlDocPath);
            c.DescribeAllEnumsAsStrings();

with the above configuration

Development

 "AppSettings": {
"VirtualDirectory": "/"

}

Staging

 "AppSettings": {
"VirtualDirectory": "/Api/"

}

The end point for UI on the dev machine with staging ON

http://localhost:5001/api-docs/v1/swagger.json

but the same one on the staging server

http://xxxx:5002/swagger/Api/api-docs/v1/swagger.json

instead of ( what it should be)

http://xxxx:5002/Api/api-docs/v1/swagger.json
6 Answers

Adding "../" works for websites hosted under virtual directory and without virtual directory

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

I changed this line in Swagger UI configure (Startup.cs):

c.SwaggerEndpoint("/prueba/swagger/v1/swagger.json", "Swagger (....)");

Unfortunately, None of them works for me.
I have tried all of them.

Working solution:

app.UseSwagger(c => {
    c.RouteTemplate = "swagger/{documentName}/swagger.json";
});

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

What worked for me is,

            app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("swagger/v1/swagger.json", "MyDevOpsAPI V1");
        });

Note that I have removed the leading "/".

It took me some time to get it running so i want to share my solution here

    string vpath = s.GetValue<string>("VirtualPath") ?? string.Empty;

    if (string.IsNullOrWhiteSpace(vpath))
    {
        app.UseSwagger();
        app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", endpointName); });
    }
    else
    {
            app.UseSwagger(c =>
            {
                //no virtual path in the roue template it is relative 
                c.RouteTemplate = $"swagger/{{documentName}}/swagger.json";
                //c.PreSerializeFilters.Add((swagger, request) => swagger.BasePath = $"/{vpath}");
            });
            app.UseSwaggerUI(options =>
            {
                //options.RoutePrefix = vpath;
                //gives the location of the gennerated json file to the UI
                //start with / to create an absolute path from the base directory
                options.SwaggerEndpoint($"/{vpath}/swagger/v1/swagger.json", endpointName);
            });
    }
Related