zolty13
zolty13

Reputation: 2231

How to pass Location header to response with command(API) and query(odata) controllers

Scenario

I have command API controller written in ASP.Net core 2.2. Controller inherited from ControllerBase and has attribute ApiController. I would like to add Location header. I have also query odata controller. Odata version: 7.2.2.

Odata codes:

My Odata controller:

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

Odata Get action:

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

Startup

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());
});

Tried

I've tried using CreatedAtAction but I received: InvalidOperationException: No route matches the supplied values.

In my POST controller:

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

Tried 2

I have also tried with return Location header manually. But I recieved: Header is not present in response.

Code

    [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);
    }

Summary

I am looking for solution which enable me to include Location header. It does not matter if it be with CreatedAt or by hand.

Upvotes: 1

Views: 1698

Answers (1)

Nkosi
Nkosi

Reputation: 246998

Should be able to create it by hand as well.

[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;
}

Upvotes: 1

Related Questions