c# пример - Как вернуть определенный код статуса и содержимое с контроллера?




уроки web (3)

this.HttpContext.Response.StatusCode = 418; // I'm a teapot

Как завершить запрос?

Попробуйте другое решение:

return StatusCode(418);


Вы можете использовать StatusCode(???) для возврата любого кода состояния HTTP.


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

Успех:

  • return Ok() ← Код состояния Http 200
  • return Created() ← Код состояния Http 201
  • return NoContent(); ← Код статуса Http 204

Ошибка клиента:

  • return BadRequest(); ← Код статуса Http 400
  • return Unauthorized(); ← Код статуса Http 401
  • return NotFound(); ← Код статуса Http 404


Подробнее:

Я хочу, чтобы приведенный ниже пример контроллера возвращал код состояния 418 без содержимого. Установка кода состояния достаточно проста, но, похоже, есть что-то, что нужно сделать, чтобы сигнализировать о завершении запроса. В MVC до ASP.NET Core или в WebForms, который может быть вызовом Response.End() но как он работает в ядре ASP.NET, где Response.End не существует?

public class ExampleController : Controller
{
    [HttpGet][Route("/example/main")]
    public IActionResult Main()
    {
        this.HttpContext.Response.StatusCode = 418; // I'm a teapot
        // How to end the request?
        // I don't actually want to return a view but perhaps the next
        // line is required anyway?
        return View();   
    }
}

Этот код может работать для не-NET Core MVC-контроллеров:

this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);

То, что вы делаете с возвратом «Явных типов» с контроллера, не собирается сотрудничать с вашим требованием явно обращаться с вашим собственным кодом ответа . Самое простое решение - пойти с IActionResult (как предполагали другие); Тем не менее, вы также можете явно управлять своим типом возврата с помощью фильтра [Produces] .

Использование IActionResult .

Чтобы получить контроль над результатами состояния, вам нужно вернуть IActionResult где вы можете использовать тип StatusCodeResult . Тем не менее, теперь у вас есть проблема с желанием заставить формат partiular ...

Ниже приведен материал из документа Microsoft: данные ответа на форматирование - форматирование особого формата

Принуждение особого формата

Если вы хотите ограничить форматы ответов для определенного действия, вы можете применить фильтр [Produces] . Фильтр [Produces] определяет форматы ответов для определенного действия (или контроллера). Как и большинство Filters , это можно применить к действию, контроллеру или глобальной области.

Объединяя все это

Ниже приведен пример контроля над StatusCodeResult в дополнение к управлению «явным типом возврата».

// GET: api/authors/search?namelike=foo
[Produces("application/json")]
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
    var result = _authorRepository.GetByNameSubstring(namelike);
    if (!result.Any())
    {
        return NotFound(namelike);
    }
    return Ok(result);
}

Я не большой сторонник этой схемы дизайна, но я затронул эти проблемы в некоторых дополнительных ответах на вопросы других людей. Вам нужно будет заметить, что фильтр [Produces] потребует от вас сопоставить его с соответствующим Formatter / Serializer / Explicit Type. Вы можете взглянуть на этот ответ для получения большего количества идей или этого для реализации более детального контроля над вашим API-интерфейсом ASP.NET Core .





c# asp.net-core asp.net-core-mvc asp.net-core-webapi