Множественные методы HttpPost в контроллере предотвращают генерацию swagger .json - PullRequest
0 голосов
/ 07 июня 2018

У меня есть контроллер Authors в примере C # ASP.NET Core 2.0 Api, и я использую Swashbuckle для генерации Swagger .json.

Когда я включаю следующие два метода в мой AuthorsController, .json делаетне генерировать

    [HttpPost(Name = "CreateAuthor")]
     public IActionResult CreateAuthor([FromBody] AuthorForCreationDto author)
    {
      return null //for simplicity repeating the problem
    }

и

[HttpPost(Name = "CreateAuthorWithDateOfDeath")]
public IActionResult CreateAuthorWithDateOfDeath(
        [FromBody] AuthorForCreationWithDateOfDeathDto author)
    {
        return null 
    }

Затем, когда я пытаюсь получить доступ к интерфейсу Swagger, я получаю

Не удалось загрузить определение API.undefined ./v1/swagger.json

enter image description here

Однако, если я закомментирую любой из этих методов, будет сгенерирован .json.

При запускеConfigureServices у меня есть

services.AddSwaggerGen(c => {
    c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();

    c.SwaggerDoc("v1", new Info
    {
        Version = "v1",
        Title = "track3 API",
        Description = "ASP.NET Core Web API",
        TermsOfService = "None",
        Contact = new Contact
        {
            Name = "my name",
            Email = "myemail@mydomain.com"
        }
    });

});

где

public class AuthorizationHeaderParameterOperationFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors;
        var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter);
        var allowAnonymous = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);

        if (isAuthorized && !allowAnonymous)
        {
            if (operation.Parameters == null)
                operation.Parameters = new List<IParameter>();

            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "Authorization",
                In = "header",
                Description = "access token",
                Required = true,
                Type = "string"
            });
        }
    }
}

и в Configure у меня есть

        app.UseSwaggerUI(c =>
        {
            c.RoutePrefix = "api-docs";
            c.SwaggerEndpoint("./v1/swagger.json", "Api v1");
        });

Почему это будет?

[Обновить]

Существует второй аналогичный метод в контроллере.Если я закомментирую второй метод и отомментирую первый, то сгенерируется .json.Ни один из методов не появится в Swagger

Вот код для Dto

public class AuthorForCreationDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTimeOffset DateOfBirth { get; set; }
    public string Genre { get; set; }

    public ICollection<BookForCreationDto> Books { get; set; }
    = new List<BookForCreationDto>();
}

public class AuthorForCreationWithDateOfDeathDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTimeOffset DateOfBirth { get; set; }
    public DateTimeOffset? DateOfDeath { get; set; }
    public string Genre { get; set; }
}

public class BookForCreationDto : BookForManipulationDto
{
}

public abstract class BookForManipulationDto
{
    [Required(ErrorMessage = "You should fill out a title.")]
    [MaxLength(100, ErrorMessage = "The title shouldn't have more than 100 characters.")]
    public string Title { get; set; }

    [MaxLength(500, ErrorMessage = "The description shouldn't have more than 500 characters.")]
    public virtual string Description { get; set; }
}
...