Swagger не создает файл json для второго метода - PullRequest
0 голосов
/ 26 мая 2020

Хорошо, у меня есть один контроллер и две функции, но когда я пытаюсь go размахивать URL-адресом, мне не удалось загрузить файл json, но я полагаю, что это связано с тем, что несколько действий одинаковы

Произведена ошибка

Ошибка выборки Ошибка внутреннего сервера /swagger/v1/swagger.json

Я пробовал эту строку, предложенную другим, так что quesiton

c .ResolveConflictingActions (apiDescriptions => apiDescriptions.First ());

Но затем этот метод скрыл метод из представления документации swagger, так как человек сможет его протестировать . Что-то не так, что я делаю в своем контроллере?

public class BmiInformationsController : ControllerBase
{
    private readonly AppManagerDBContext _context;

    public BmiInformationsController(AppManagerDBContext context)
    {
        _context = context;
    }
    [HttpGet]
    public async Task<ActionResult<IEnumerable<BmiInformation>>> GetBmiInformation() {
        return await _context.BmiInformation.ToListAsync();
    }

    // GET: api/BmiInformations
    [HttpGet]
    public async Task<ActionResult<IEnumerable<BmiInformation>>> GetBmiInformationByUserId(string id)
    {
        return await _context.BmiInformation.Where(w => w.TennentId == new Guid(id)).ToListAsync();
    }        
}

Вот как я настроил свой чванство

 services.AddSwaggerGen(c => {
   c.SwaggerDoc("v1", new OpenApiInfo { Title = "App Manager - Running Buddies", Version = "v1" });
   c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

   c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme {
   Description = "JWT Authorization header using the Bearer scheme.",
   Name = "Authorization",
   In = ParameterLocation.Header,
   Type = SecuritySchemeType.Http,
   Scheme = "bearer",
   BearerFormat = "JWT"

 });

Мои маршруты в моем файле запуска.

app.UseEndpoints(endpoints => {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
});

1 Ответ

1 голос
/ 26 мая 2020

Добавьте явные маршруты с атрибутом [Route] над методами контроллера и действий следующим образом:

[ApiController]
[Route("api")]
public class BmiInformationsController : ControllerBase
{
    private readonly AppManagerDBContext _context;

    public BmiInformationsController(AppManagerDBContext context)
    {
        _context = context;
    }

    [HttpGet]
    [Route("bmi/all")]
    public async Task<ActionResult<IEnumerable<BmiInformation>>> GetBmiInformation() {
        return await _context.BmiInformation.ToListAsync();
    }

    // GET: api/BmiInformations
    [HttpGet]
    [Route("bmi/{id}")]
    public async Task<ActionResult<IEnumerable<BmiInformation>>> GetBmiInformationByUserId(string id)
    {
        return await _context.BmiInformation.Where(w => w.TennentId == new Guid(id)).ToListAsync();
    }        
}

При настройке явных маршрутов больше нет конфликтующих действий, и чванство может отображать оба действия.

Вы также можете удалить c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); (поэтому второй метод не был включен в swagger. json, вы использовали только первый в случае конфликта маршрутов).

...