c# Asp. NET Core 3.1 CreatedAtRoute с управлением версиями API - PullRequest
0 голосов
/ 08 мая 2020

Я просмотрел все сообщения по данной проблеме, но не нашел приемлемого ответа на эту проблему. У меня есть контроллер с Get и Post следующим образом:

[ApiController]
[ApiVersion(StringResources.ApiV10)] //"1.0"
[Route(StringResources.RouteWithVersioning)] //"api/v{version:apiVersion}/[controller]"
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public class ProductsController : ControllerBase
{
    private readonly IMediator _mediator;

    public ProductsController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    [ProducesResponseType(typeof(CreateProductResponse), StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status409Conflict)]
    public ActionResult<CreateProductResponse> Create([FromBody]CreateProductRequest request)
    {
        try
        {
            var oid = _mediator.Send(new CreateProdRequest
            {
                Name = request.Name
            });

            return CreatedAtRoute(StringResources.GetProduct, 
                new
                {
                    Oid = oid
                },
                new CreateProductResponse {Oid= oid});
        }
        catch (ProductException e) when(e.Errors.Select(err => err.Code).ToList().Contains("DuplicateProductName"))
        {
            return Conflict(ApiErrors.ProductAlreadyExist4091);
        }
    }

    [HttpGet(Name = StringResources.GetProduct)]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public ActionResult<GetProductResponse> Get([FromQuery]GetProductRequest request)
    {
        var result = _mediator.Send(new GetRequest
        {
            Oid = request.Oid
        });

        if (result == null)
            return NotFound();

        return Ok(result);
    }
}

, но когда я создаю продукт и возвращаю CreateAtRoute, я всегда получаю исключение:

exception.System.InvalidOperationException: No route matches the supplied values.

Класс GetProductRequest содержит только Oid свойства. Я тоже пытался использовать CreateAtAction, но URI, возвращенный в заголовке, неверен (он не содержит путь / api / v1 / Products). Стартовая конфигурация для промежуточного программного обеспечения следующая:

app.UseEndpoints(endpoints =>
{
     endpoints.MapControllers();
});

, а для сервисов:

services.AddApiVersioning(options =>
{
     options.ReportApiVersions = true;
     options.AssumeDefaultVersionWhenUnspecified = true;
     options.DefaultApiVersion = new ApiVersion(1, 0);
});

services.AddVersionedApiExplorer(options =>
{
     options.GroupNameFormat = "'v'VVV";
     options.SubstituteApiVersionInUrl = true;
});

Я считаю, что проблема связана с тем, что в пути присутствует управление версиями API. , но я не знаю, как это исправить. Пожалуйста, помогите мне.

1 Ответ

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

Маршруту ("api/v{version:apiVersion}/[controller]") нужен параметр с именем version, поэтому передайте ApiVersion вашему действию и отправьте его вместе со значениями маршрута:

public ActionResult<CreateProductResponse> Create(
    [FromBody] CreateProductRequest request,
    ApiVersion version) // <-- Add this
{
    ⋮
    return CreatedAtRoute(
        StringResources.GetProduct, 
        new
        {
            Oid = oid,
            version = version.ToString() // <-- And this
        },
        new CreateProductResponse {Oid = oid});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...