Как указать схему https в Swashbuckle для .NET Core

Как указать схему https в версии Swashbuckle .NET Core? В версии ASP.NET я мог бы сделать

.EnableSwagger(c =>
{
  c.Schemes(new[] { "https" });
}

но я не вижу ничего подобного в составе AddSwaggerGen.


person SiberianGuy    schedule 01.02.2017    source источник


Ответы (4)


Просто реализуйте интерфейс IDocumentFilter и используйте его в Startup.cs:

public class TestFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        swaggerDoc.Schemes = new string[] { "http" };
    }
}

// Startup.cs
services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("v2", new Swashbuckle.AspNetCore.Swagger.Info 
                        { Title = "My API", Version = "v2" });
     c.DocumentFilter<TestFilter>();
 });
person mhofer4991    schedule 02.03.2017
comment
Когда я использую этот код, swaggerDoc.Schemes не разрешается. - person Lost; 28.02.2020
comment
Больше нет свойства Schemes, это не работает с последней версией swashbuckle. - person Marius; 24.02.2021

У меня сработало решение от @marius, за исключением локального запуска. Как он справедливо отмечает, httpReq.Host.Host не будет указывать номер порта. В качестве улучшения приведенный ниже фрагмент кода сохраняет номер порта и работает как на локальном хосте, так и на размещенном API. ПРИМЕЧАНИЕ: мой локальный хост находится на HTTP

Версия пакета Nuget: Swashbuckle.AspNetCore 6.0.7

app.UseSwagger(options =>
{
    options.PreSerializeFilters.Add((swagger, httpReq) =>
    {
        var scheme = httpReq.Host.Host.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) ? "http" : "https";
        swagger.Servers = new List<OpenApiServer>() {new OpenApiServer() {Url = $"{scheme}://{httpReq.Host}"}};
    });
});
person Sudhanshu Mishra    schedule 03.03.2021
comment
Когда я добавляю этот код, я получаю сообщение Не удалось загрузить файл или сборку «Swashbuckle.AspNetCore.SwaggerGen, Version=6.1.0.0..», даже если Swashbuckle.AspNetCore.SwaggerGen.dll установлен и находится на месте. Как в разработке, так и в производстве - person Giox; 11.03.2021

В Swashbuckle.AspNetCore v 6.0.7 вы можете сделать это:

                app.UseSwagger(c => {
                    c.PreSerializeFilters.Add((swagger, httpReq) =>
                    {
                        swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"https://{httpReq.Host.Host}" } };
                    });
                });

Обратите внимание: в приведенном выше примере предполагается порт 443, вам также необходимо будет указать номер порта https, если это не так.

person Marius    schedule 24.02.2021
comment
Это очень чисто, но по какой-то причине моя IDE не импортировала OpenApiServer автоматически. Если кто-то еще получит сообщение об ошибке, попробуйте using Microsoft.OpenApi.Models; в верхней части файла вместе с другими операторами использования. Также немного пробелов никогда не повредит с новыми строками после этих фигурных / лицевых скобок :wink:. - person MrMesees; 01.04.2021

Вы можете использовать этот код в последней версии swagger:

 public class SwaggerDocumentFilter : IDocumentFilter

    {

        private readonly string _swaggerDocHost;


        public SwaggerDocumentFilter(IHttpContextAccessor httpContextAccessor)

        {

            var host = httpContextAccessor.HttpContext.Request.Host.Value;

            var scheme = httpContextAccessor.HttpContext.Request.Scheme;

            _swaggerDocHost = $"{scheme}://{host}";

        }


        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)

        {

            swaggerDoc.Servers.Add(new OpenApiServer { Url = _swaggerDocHost });

        }

    }

Если вы хотите установить _swaggerDocHost=https://имя сайта.

person hakantopuz    schedule 15.12.2020