如何在开发/测试和生产环境中配置Swagger

vql8enpb  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(264)

我已经在我的.NET 6 Web API项目中配置了Swagger。在本地,我可以访问Swagger文件。下面是我的代码。

public static void ConfigureSwaggerMiddleware(this WebApplication app)
        {
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("/swagger/v1/swagger.yaml", "API V1");
                   
                });
            }
            else
            {
                app.UseSwagger();
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("swagger/v1/swagger.yaml", "API V1");
                    c.RoutePrefix = "api/abc";

                });
            }
        }

现在,我想在开发、测试和更高版本的环境(如API)中配置其URL。我正在尝试上述代码,但收到错误消息
找不到网址为的网页:本地主机:7120

jjjwad0x

jjjwad0x1#

如果你只是改变了路由前缀,恐怕你想要的东西是不能实现的。

public static IApplicationBuilder UseSwaggerUI(
            this IApplicationBuilder app,
            Action<SwaggerUIOptions> setupAction = null)
        {
            SwaggerUIOptions options;
            using (var scope = app.ApplicationServices.CreateScope())
            {
                options = scope.ServiceProvider.GetRequiredService<IOptionsSnapshot<SwaggerUIOptions>>().Value;
                setupAction?.Invoke(options);
            }

            // To simplify the common case, use a default that will work with the SwaggerMiddleware defaults
            if (options.ConfigObject.Urls == null)
            {
                var hostingEnv = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                options.ConfigObject.Urls = new[] { new UrlDescriptor { Name = $"{hostingEnv.ApplicationName} v1", Url = "v1/swagger.json" } };
            }

            return app.UseSwaggerUI(options);
        }

当我们没有为使用swagger UI设置任何配置选项时,它会将默认的URL设置为v1/swagger.json,并带有默认的路由前缀public string RoutePrefix { get; set; } = "swagger";。这会使我们获取swagger.json文件来加载索引页。当您更改路由前缀值时,它会使您的API应用程序无法找到swagger配置文件,这将使其出现404错误。
因此我们需要更改launchsetting.json并添加app.UseSwagger选项。我参考了this answer
这是我在Program.cslaunchsetting.json中的配置,我更改了"launchUrl": "api/abc/swagger"

if (app.Environment.IsDevelopment())
{
    //app.UseSwagger();
    app.UseSwagger(c =>
    {
        c.RouteTemplate = "api/abc/swagger/{documentname}/swagger.json";
    });
    //app.UseSwaggerUI();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/api/abc/swagger/v1/swagger.json", "API V1");
        c.RoutePrefix = "api/abc/swagger";
    });
}

然后当API应用程序运行时,它将指向https://localhost:7212/api/abc/swagger/index.html并显示API。

相关问题