Задать вопрос
Timur2342
@Timur2342

Swagger отправляет ответ бесконечно, почему?

Есть API Controller который имеет вот такой endpoint:
[ProducesResponseType(StatusCodes.Status200OK)]
    [HttpGet("get-all-alert-sets")]
    public async Task<IActionResult> GetAllAlertSets([FromQuery] bool newestFirst = true)
    {
        var allAlertSets = await alertSetRepository.GetAllAlertSets(newestFirst);
        var yaml = YamlHelper.SerializeObjectThroughUnderscoredNamingConvention(allAlertSets);

        logger.LogInformation(yaml);
        return Content(yaml, "application/yaml");
    }

Данный endpoint работает быстро, суммарно потребовалось 160 млс чтобы репозиторий вернул ответ и yaml создался.

Program.cs:
public class Program
{
    private static async Task Main(string[] args)
    {
        ...
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen(opts =>
        {
            opts.EnableAnnotations();

            opts.MapType<Ulid>(() => new OpenApiSchema
            {
                Type = "string",
                Format = "ulid",
                Example = new OpenApiString("01KJQP6EE9NS5K8YJS0Y4T0CY8")
            });

            opts.SwaggerDoc(
                name: "v1",
                info: new OpenApiInfo
                {
                    Title = "Kvindo.MonitoringSystem.WebApi v1",
                    Version = "v1"
                });

            var xmlPath = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            xmlPath = Path.Combine(AppContext.BaseDirectory, xmlPath);
            opts.IncludeXmlComments(xmlPath);
        });
        ...
        var app = builder.Build();
        ...
        app.UseSwagger();
        app.UseSwaggerUI(options =>
        {
            options.SwaggerEndpoint("/swagger/v1/swagger.json", "Kvindo.MonitoringSystem.WebApi v1");
        });

        app.UseRouting();
        app.MapControllers();
        app.Run();
    }
}


В целом API работает хорошо, проверял через curl, все ок, ответ моментальный, а вот Swagger после выполнения запроса просто бесконечно крутит "загрузку", так же отправляет в консоль ошибку:
RangeError: Maximum call stack size exceeded
    at OrderedMap.set (swagger-ui-bundle.js:2:70592)
    at swagger-ui-bundle.js:2:60197
    at ObjectSeq.__iterate (swagger-ui-bundle.js:2:36134)
    at ObjectSeq.forEach (swagger-ui-bundle.js:2:84933)
    at swagger-ui-bundle.js:2:60165
    at OrderedMap.withMutations (swagger-ui-bundle.js:2:44734)
    at Object.OrderedMap (swagger-ui-bundle.js:2:60087)
    at fromJSOrdered (swagger-ui-bundle.js:2:543049)
    at swagger-ui-bundle.js:2:62227
    at ArraySeq.__iterate (swagger-ui-bundle.js:2:35590)


Именно дело в Swagger-е и обработке ответа, потому что я смотрел дебагером, endpoint выполнялся быстро.
Swagger.json проверял через editor.swagger.io, на нем все быстро и правильно запустилось, меньше секунды заняло.

Есть варианты в чем дело? Пробывал менять Content на File или просто Ok(yaml), пробывал атрибуты добавлять/менять, резултат тот же. При том что yaml не большой. Возможно он просто имеет много "веток", ну то есть класс внутри множество других классов.
  • Вопрос задан
  • 10 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    WEB программирование на ASP.NET Core
    2 недели
    Далее
  • Яндекс Практикум
    Продвинутая разработка на C# и .NET
    5 месяцев
    Далее
  • Stepik
    WEB программирование на ASP.NET Core. ВСЕ САМ
    2 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Это не endpoint зависает — Swagger UI падает в рекурсию при отрисовке ответа. Добавь
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
— тогда схема ответа будет просто строка, а не граф объекта. Если всё ещё крутит — смени content type на text/plain, с ним UI не лезет в структуру. В DevTools запрос уже завершён.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы