Как вернуть код состояния HTTP 200 из контроллера ASP.NET MVC 3

218

Я пишу приложение, которое принимает данные POST от стороннего сервиса.

Когда эти данные отправлены, я должен вернуть код состояния HTTP 200.

Как я могу сделать это с моего контроллера?

Пол Браун
источник

Ответы:

390

В вашем контроллере вы должны вернуть HttpStatusCodeResult, как это ...

[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
}
Брайан Бем
источник
14
или, скорее, «вернуть новый HttpStatusCodeResult ((int) HttpStatusCode.OK);»
дан
1
@ дан, это не нужно. Есть перегрузки, которые принимают, intа также HttpStatusCode.
MEMark
11
чтобы вернуть код состояния 204, сделайте это: верните новый HttpStatusCodeResult (HttpStatusCode.NoContent);
Дэвид Сильва Смит
1
@MEMark, мне пришлось сыграть, чтобы заставить его работать. При использовании .NET 4 и MVC 3 мне не было предоставлено переопределение, которое бы принимало HttpStatusCode.
Шон Саут,
@ShawnSouth, я не могу найти никакой информации в документации о том, какие версии содержат эту перегрузку. msdn.microsoft.com/en-us/library/hh413957(v=vs.118).aspx
MEMark
52

200 - это обычный HTTP-заголовок для успешного запроса. Если это все, что вам нужно, просто иметь контроллерreturn new EmptyResult();

Кевин Стрикер
источник
3
Вы должны использовать HttpStatusCodeResult(...)вместо этого, поскольку это намного более ясно о том, что вы пытаетесь достичь. Согласно принятому ответу.
Бен
43

Вы можете просто установить код статуса ответа 200 следующим образом

public ActionResult SomeMethod(parameters...)
{
   //others code here
   ...      
   Response.StatusCode = 200;
   return YourObject;  
}
разъем
источник
11
Upvote, потому что это позволяет вам отправлять обратно другую информацию, а также только код состояния
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 });
        }
    }
Брайан Огден
источник
Точно мой вариант использования, возвращающий объект Json, но он также хотел предоставить HTTP_STATUS_CODE
sobelito
Для WebAPI, возвращающих коды состояния, используйте: new StatusCodeResult (HttpStatusCode.NotModified, Request);
Джеймс Джойс
Лучший ответ, поскольку он объединяет все варианты использования
vibs2006
8

Способ сделать это в .NET Core (на момент написания) следующим образом:

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

    return StatusCode(400);
}

Метод StatusCode возвращает тип StatusCodeResult, который реализует IActionResult и, таким образом, может использоваться в качестве возвращаемого типа вашего действия.

В качестве рефакторинга вы могли бы улучшить читаемость, используя приведенный ниже список кодов состояния HTTP:

return StatusCode((int)HttpStatusCode.OK);

Кроме того, вы также можете использовать некоторые встроенные типы результатов. Например:

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

Ссылка StatusCodeResult - https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.statuscoderesult?view=aspnetcore-2.1

user1477388
источник