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

问题描述 投票:0回答:6

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

本地主机:

https://localhost:44381/swagger/index.html

接口:

http://200.155.29.14/SimuladorFrete/Swagger/index.html

当我在 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");
        }

    });
}

这是我的 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 = "[email protected]"
          }
      });

        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
    });
}

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

[HttpPost]
public ContentResult Post([FromBody]dadosFrete xml)
{
    // code logic
}
c# asp.net-core asp.net-web-api swagger swashbuckle
6个回答
46
投票

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

image


9
投票

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

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

如果这个解决方案不起作用。 然后检查发布设置。问题是使用 -r Release 运行 dotnet publish 不会生成 XML 文件。但是,带有 -r Debugdotnet publish 实际上会生成文件。这解释了为什么人们只有在部署到本地以外的环境时才会遇到这个问题。 您可以在 Project > Your Project properties > Build Tab

中简化查找

3
投票

以下对我有用。我能够让它在 IIS 上本地工作。

  1. 您需要将项目发布到文件夹并将 IIS 指向该文件夹。
  2. 编辑Configure方法,将Swagger移出env.IsDevelopment,使用上面vipul的方案固定路径。
 if (env.IsDevelopment())
 {
   app.UseDeveloperExceptionPage();
 }
 app.UseSwagger();
 app.UseSwaggerUI(c =>
 {
   string swaggerJsonBasePath = string.IsNullOrWhiteSpace(c.RoutePrefix) ? "." : "..";
   c.SwaggerEndpoint($"{swaggerJsonBasePath}/swagger/v1/swagger.json", "Web API");

 });


1
投票

看看如何在 .net core 中使用 multiple environments。 一些选项是

  • 为您的不同环境(dev/stage/prod)使用
    launch.json
    文件(仅限本地开发)
  • 添加名为
    ASPNETCORE_ENVIRONMENT
    的环境变量,带有
    development
    stage
    production
  • 或者制作一个
    web.config
    部署到IIS并添加值
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

对于IIS,这完全取决于IIS的版本。旧版本的 IIS,我相信你只能用 web.config 了。


0
投票

我知道这已经过时了,但在这个问题上它在谷歌中排名靠前。 以上都不适合我。我没有得到 500(或 404),只是一个空白的 Swagger 页面。我也可以打开 swagger.json OK 我真正的问题是系统管理员在这里的服务器上不允许除 IE 之外的任何东西,所以我在本地使用 IE 测试我的部署(在他们打开防火墙端口之前)。 Swagger 页面打开,但在 IE 中不显示任何内容。 违反规则,我安装了 Edge,并且 swagger 运行良好。 希望这可以节省别人一个浪费的早晨。


-1
投票

只需编辑您的 csproj 文件并添加以下代码片段

<PropertyGroup>
 <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
© www.soinside.com 2019 - 2024. All rights reserved.