У меня есть 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();
}