Como retornar um código de status HTTP 200 do controlador ASP.NET MVC 3

217

Estou escrevendo um aplicativo que aceita dados POST de um serviço de terceiros.

Quando esses dados são postados, devo retornar um código de status HTTP 200.

Como posso fazer isso no meu controlador?

Paul Brown
fonte

Respostas:

389

No seu controlador, você retornaria um HttpStatusCodeResult como este ...

[HttpPost]
public ActionResult SomeMethod(...your method parameters go here...)
{
   // todo: put your processing code here

   //If not using MVC5
   return new HttpStatusCodeResult(200);

   //If using MVC5
   return new HttpStatusCodeResult(HttpStatusCode.OK);  // OK = 200
}
Brian Behm
fonte
14
ou melhor, "retornar novo HttpStatusCodeResult ((int) HttpStatusCode.OK);"
dan
1
@dan, isso não é necessário. Há sobrecargas que levam inttanto quanto um HttpStatusCode.
MEMark
11
para retornar um código de status 204, faça o seguinte: retorne novo HttpStatusCodeResult (HttpStatusCode.NoContent);
David Silva Smith
1
@ MarkM, eu tive que lançar para fazê-lo funcionar. Usando o .NET 4 e MVC 3, não recebi uma substituição que levaria um HttpStatusCode.
Shawn South
@ ShawnSouth, não consigo encontrar nenhuma informação nos documentos sobre quais versões contêm essa sobrecarga. msdn.microsoft.com/en-us/library/hh413957(v=vs.118).aspx
MEMark
52

200 é apenas o cabeçalho HTTP normal para uma solicitação bem-sucedida. Se é tudo o que você precisa, basta ter o controladorreturn new EmptyResult();

Kevin Stricker
fonte
3
Você deve usar HttpStatusCodeResult(...), pois é muito mais explícito sobre o que você está tentando alcançar. Conforme a resposta aceita.
Ben
42

Você pode simplesmente definir o código de status da resposta para 200 como o seguinte

public ActionResult SomeMethod(parameters...)
{
   //others code here
   ...      
   Response.StatusCode = 200;
   return YourObject;  
}
Jack
fonte
10
Voto positivo, pois isso permite que você envie outras informações, bem como apenas o código de status
Avrohom Yisroel /
22
    [HttpPost]
    public JsonResult ContactAdd(ContactViewModel contactViewModel)
    {
        if (ModelState.IsValid)
        {
            var job = new Job { Contact = new Contact() };

            Mapper.Map(contactViewModel, job);
            Mapper.Map(contactViewModel, job.Contact);

            _db.Jobs.Add(job);

            _db.SaveChanges();

            //you do not even need this line of code,200 is the default for ASP.NET MVC as long as no exceptions were thrown
            //Response.StatusCode = (int)HttpStatusCode.OK;

            return Json(new { jobId = job.JobId });
        }
        else
        {
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return Json(new { jobId = -1 });
        }
    }
Brian Ogden
fonte
Exatamente o meu caso de uso, retornando objeto JSON, mas também queria fornecer HTTP_STATUS_CODE
sobelito
Para WebAPI retornando códigos de status, use: new StatusCodeResult (HttpStatusCode.NotModified, Request);
James Joyce
Melhor resposta uma vez que combina todos os casos de uso
vibs2006
7

A maneira de fazer isso no .NET Core é (no momento da escrita) da seguinte maneira:

public async Task<IActionResult> YourAction(YourModel model)
{
    if (ModelState.IsValid)
    {
        return StatusCode(200);
    }

    return StatusCode(400);
}

O método StatusCode retorna um tipo de StatusCodeResult que implementa IActionResult e, portanto, pode ser usado como um tipo de retorno da sua ação.

Como um refator, você pode melhorar a legibilidade usando uma conversão dos enum de códigos de status HTTP, como:

return StatusCode((int)HttpStatusCode.OK);

Além disso, você também pode usar alguns dos tipos de resultados incorporados. Por exemplo:

return Ok(); // returns a 200
return BadRequest(ModelState); // returns a 400 with the ModelState as JSON

Ref. StatusCodeResult - https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.statuscoderesult?view=aspnetcore-2.1

user1477388
fonte