Daan
Daan

Reputation: 2918

How to effectively set the ServerUrl in the NSwag settings?

I have a working ASP .NET 5 application with a REST API and a Swagger interface using the NSwag library (so not Swashbuckle as many people use instead). I have found (or at least I have thought so) a way to set the server url. There is a property to set this. Here is my code:

app.UseSwaggerUi3(settings =>
{
    settings.ServerUrl = "https://XXXXX.YYYYY.com/ZZZZ";
    settings.TransformToExternalPath = (url, request) =>
    {
        // Get the UI to properly find the relative path of the swagger json instead of absolute path.
        string outputUrl;
        if (url.EndsWith(".json") || request.Path.ToString().EndsWith("/")) outputUrl = ".." + url;
        else outputUrl = request.PathBase + "." + url;
        return outputUrl;
    };
});

However, when running my application and using the swagger interface, the set server url is not used at all... It simply refers to same host as it does without setting it. I know it is possible to change the routing behavior of swagger when needed (as explained here and I also used this code) but that basically solves the problem of not being able to find the swagger json. However, I did not find a way to effectively set the server url. When I use the code shown in this post, the request url when executing a request refers to the same url when not using it.

How can I fix this? How to effectively set the server url? This is so strange. I looks like the property does not do anything at all.

Upvotes: 3

Views: 2015

Answers (1)

Johan Kronberg
Johan Kronberg

Reputation: 1086

For me it seems to work well using the Host property in PostProcess. I set it to null to get the UI working for all incoming host names.

I'm on Owin version but same looks like it should work in 5/6 as well.

RouteTable.Routes.MapOwinPath("swagger", app =>
{
    ..
    app.UseSwaggerUi3(typeof(Global).Assembly, c => {
        // Fix to make UI work regardless of hostname serving
        c.PostProcess = document => {
            document.Host = null;
        };
    });
});

The ServerUrl property looks like it's only used as RedirectUrl in an eventual OAuth2 flow.

Upvotes: 1

Related Questions