Как передать заголовок Location в ответ с помощью контроллеров команд (API) и запросов (odata) - PullRequest
0 голосов
/ 06 ноября 2019

Сценарий

Привет! У меня есть командный контроллер API, написанный на ядре ASP.Net 2.2. Контроллер унаследован от ControllerBase и имеет атрибут ApiController . Я хотел бы добавить заголовок местоположения. Я также запросить контроллер оддаты. Версия Odata: 7.2.2 .

Коды Odata:

Мой контроллер Odata:

[ODataRoutePrefix("categories")]
public class ODataCategoriesController : ODataController

Odata Получить действие:

[EnableQuery]
[ODataRoute("{id}")]
public async Task<ActionResult<Category>> GetAsync(Guid id)

Запуск

opt.EnableEndpointRouting = false;
...
app.UseHttpsRedirection();
app.UseMvc(options =>
{
     options.EnableDependencyInjection();
     options.Select().Filter().OrderBy().Count().Expand().MaxTop(100).SkipToken();
     options.MapODataServiceRoute("odata", "api/odata", GetExplicitEdmModel());
});

Пробовал

Я пытался использовать CreatedAtAction, но получил: InvalidOperationException: ни один маршрут не соответствует предоставленным значениям.

В моем контроллере POST:

return CreatedAtAction("Get", "ODataCategories", new { id= categoryResponse.Id }, categoryResponse);

Пробовал 2

У меня естьтакже пробовал с возвращением заголовка местоположения вручную. Но я получил: Заголовок отсутствует в ответе.

Код

    [HttpPost]
    [ProducesResponseType((int)HttpStatusCode.Created)]
    [ProducesResponseType((int)HttpStatusCode.BadRequest)]
    public async Task<ActionResult<CreateCategoryResponse>> PostCategory(
        [FromBody]CreateCategoryCommand createCategoryCommand)
    {
        CreateCategoryResponse categoryResponse =
            await _mediator.Send(createCategoryCommand);

        if (categoryResponse == null)
        {
            return BadRequest();
        }

        HttpContext.Response.Headers["Location"] = 
            $"SomeBuiltLocation";
        return Created("", categoryResponse);
    }

Сводка

Я ищу решение, которое позволило бы мне включить заголовок Location. Неважно, будет ли это с CreatedAt или вручную.

1 Ответ

1 голос
/ 06 ноября 2019

Должен быть в состоянии создать его вручную.

[HttpPost]
[ProducesResponseType((int)HttpStatusCode.Created)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<ActionResult<CreateCategoryResponse>> PostCategory(
    [FromBody]CreateCategoryCommand createCategoryCommand) {
    CreateCategoryResponse categoryResponse =
        await _mediator.Send(createCategoryCommand);

    if (categoryResponse == null) {
        return BadRequest();
    }

    var result = new CreatedResult("SomeBuiltLocation", categoryResponse);
    return result;
}
...