Как добавить SwaggerUI при отображении FallbackRoute - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть ASP. NET Базовый проект, в котором я объединяю несколько контроллеров WebApi и обслуживаю SPA (созданный в ELM) через файл Index. html.
Я добавил Swagger по причинам отладки.

Цель должна состоять в том, чтобы иметь такие маршруты:
/events -> сопоставленные с концентратором SignalR
/api/* -> сопоставленные с сетью контроллеры API
/hangfire -> отображение панели управления Hangfire
/swagger -> отображение интерфейса пользователя Swagger
• все остальное -> возврат Index.html

У меня все работает, кроме свагерского интерфейса.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    app.UseRouting();

    app.UseDefaultFiles();
    app.UseStaticFiles();

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "Swagger API V1");
    });

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<EventsHub>("/events");
        endpoints.MapControllers();
        endpoints.MapHangfireDashboard("/hangfire", new DashboardOptions
        {
            Authorization = new[] { new AllowAnyoneAuthorizationFilter() },
            IsReadOnlyFunc = _ => true
        });
        endpoints.MapFallbackToFile("index.html");
    });
}

Причина в том, что маршрут MapFallbackToFile() имеет более высокий приоритет, чем маршрут SwaggerEndpoint().
Когда я удаляю MapFallbackToFile() route swagger снова работает, но тогда все клиентские маршруты больше не работают.

Кто-нибудь может сказать мне, как добавить swagger в конфигурацию конечной точки?
Спасибо! :)

Обновление 1 - добавить метод ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy(AllowAnyOrigin, builder =>
        {
            builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
        });
    });

    services.AddControllers()
    services.AddMvc().AddControllersAsServices();

    services.AddSignalR();
    services.AddOptions();

    ... // Custom services

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "Swagger API", Version = "v1" });
    });

    services.AddHangfire(config => config
        .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
        .UseSimpleAssemblyNameTypeSerializer()
        .UseRecommendedSerializerSettings()
        .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
        {
            CommandBatchMaxTimeout = 60.Seconds(),
            SlidingInvisibilityTimeout = 60.Seconds(),
            QueuePollInterval = 60.Seconds(),
            UseRecommendedIsolationLevel = true,
            UsePageLocksOnDequeue = true,
            DisableGlobalLocks = true
        }));
    services.AddHangfireServer();
}
...