在 IIS 上部署 API 时不显示 Swagger UI

Ped*_*eal 1 c# asp.net-web-api swagger swashbuckle asp.net-core

好吧,我将 Swagger 用于我的 API 文档,它在 localhost 中运行良好,当我将它托管在 IIS 上时,问题就开始了。出于某种原因,它不再起作用了

本地主机:

https://localhost:44381/swagger/index.html
Run Code Online (Sandbox Code Playgroud)

接口:

http://200.155.29.14/SimuladorFrete/Swagger/index.html
Run Code Online (Sandbox Code Playgroud)

当我在 ISS 中部署 Swagger 后尝试打开它时,我得到的只是一个空白页面和一个 500 内部服务器错误,这并没有说明异常。

这是我的配置方法(startup.cs)

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();

    }
    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
    app.UseSwagger();
    app.UseStaticFiles();
    app.UseSwaggerUI(c =>
    {
        if (env.IsDevelopment())
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
        }
        else
        {
            // To deploy on IIS
            c.SwaggerEndpoint("/SimulaFrete/swagger/v1/swagger.json", "Web API V1");
        }

    });
}
Run Code Online (Sandbox Code Playgroud)

这是我的 ConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson();

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1",

      new OpenApiInfo
      {

          Title = "Simulador de frete por Unidade",
          Version = "v1",
          Description = "Métodos da API de simulação de frete",
          Contact = new OpenApiContact
          {
              Name = "Catalde Technology",
              Url = new Uri("https://www.catalde.com"),
              Email = "cicero.catalde@catalde.com"
          }
      });

        string caminhoAplicacao =
            PlatformServices.Default.Application.ApplicationBasePath;
        string nomeAplicacao =
            PlatformServices.Default.Application.ApplicationName;
        string caminhoXmlDoc =
            Path.Combine(caminhoAplicacao, $"{nomeAplicacao}.xml");

        c.IncludeXmlComments(caminhoXmlDoc);
        c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); //This line
    });
}
Run Code Online (Sandbox Code Playgroud)

还有我的控制器代码,它只有这个方法:

[HttpPost]
public ContentResult Post([FromBody]dadosFrete xml)
{
    // code logic
}
Run Code Online (Sandbox Code Playgroud)

vip*_*are 11

尝试这个。设置相对路径。

app.UseSwaggerUI(c =>
{
    string swaggerJsonBasePath = string.IsNullOrWhiteSpace(c.RoutePrefix) ? "." : "..";
    c.SwaggerEndpoint($"{swaggerJsonBasePath}/swagger/v1/swagger.json", "My API");
});
Run Code Online (Sandbox Code Playgroud)

如果这个解决方案不起作用。然后检查发布设置。问题是使用 -r Release 运行dotnetpublish不会生成XML 文件。但是,使用-r Debug的dotnetpublish实际上会生成该文件。这解释了为什么人们只有在部署到本地以外的环境时才会遇到此问题。您可以在“项目”>“项目属性”>“构建”选项卡中简化查找


小智 6

你需要在你的条件中临时添加生产子句,才能在生产环境中看到swagger。请参阅附图中黄色突出显示的部分。env.IsProduction()

图片

  • 它对我有用 if (env.IsDevelopment() || env.IsProduction()),谢谢 (3认同)
  • 您没有正确添加图像,请使用 ![description](link) 代替 (2认同)
  • 这个答案让我感觉自己像个轻率的白痴,很好地发现了为什么样板代码将它添加到这里。 (2认同)
  • 它在 Net6 最小 API 中适用于我 if (app.Environment.IsDevelopment() **|| app.Environment.IsProduction())** { app.UseSwagger(); app.UseSwaggerUI(); } (2认同)