Swagger не генерирует swagger.json
У меня есть основной проект MVC asp.net и отдельный проект WebApi в одном решении. Я добавляю чванство в соответствии с документацией на github. Вот мой Startup.cs проекта MVC:
public void ConfigureServices(IServiceCollection services)
{
//...
// Adding controllers from WebApi:
var controllerAssembly = Assembly.Load(new AssemblyName("WebApi"));
services.AddMvc(o =>
{
o.Filters.Add<GlobalExceptionFilter>();
o.Filters.Add<GlobalLoggingFilter>();
})
.AddApplicationPart(controllerAssembly)
.AddJsonOptions(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
services.AddSwaggerGen(c =>
{
//The generated Swagger JSON file will have these properties.
c.SwaggerDoc("v1", new Info
{
Title = "Swagger XML Api Demo",
Version = "v1",
});
});
//...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Swagger XML Api Demo v1");
});
//...
app.UseMvc(routes =>
{
// ...
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Вот нюгеты:
Маршрутизация атрибутов контроллеров WebApi:
[Route("api/[controller]")]
public class CategoriesController : Controller
{
// ...
[HttpGet]
public async Task<IActionResult> Get()
{
return Ok(await _repo.GetCategoriesEagerAsync());
}
// ...
}
Когда я пытаюсь перейти к /swagger, он не находит /swagger/v1/swagger.json:
Что я делаю не так?
Заранее спасибо!
4 ответа
Я застрял на этой проблеме в течение нескольких часов... и я нашел причину...
Проверьте код ниже!
..Startup.cs..
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
app.UseSwagger(); // if I remove this line, do not work !
app.UseSwaggerUi3();
}
Просто хотел добавить сюда свой опыт. Я дал версию вconfigureServices
как V1
(обратите внимание на V
в шапках) и
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", //this v was in caps earlier
new Swashbuckle.AspNetCore.Swagger.Info
{
Version = "v1",//this v was in caps earlier
Title = "Tiny Blog API",
Description = "A simple and easy blog which anyone love to blog."
});
});
//Other statements
}
А потом в configure
метод было в маленьком футляре
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tiny Blog V1");
});
}
Может кому-то поможет.
Вот пример кода с использованием .net core 6:
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(s =>
{
s.SwaggerDoc("v1", new OpenApiInfo { Title = "Service Manager API", Description = "API Docs for the Service Manager Layer.", Version = "v1"});
});
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Service Manager API V1");
});
app.Run();
Я столкнулся с проблемой, просто не добавляя «/» к пути (/swagger/v1... не swagger/v1/...
Проверьте, правильно ли вы установили среду, и является ли команда
app.UseSwagger
не находится внутри if для выполнения только в определенной среде, такой как разработка.
Тестовое решение - добавить строку
app.UseSwagger(
) вне любого условного оператора.