Asp.net Web Api .net6 Controller返回值总结

发布时间 2023-08-03 21:48:06作者: 工控软件开发

1、特定的类型

最基本的操作返回基元或复杂数据类型,例如, string 或自定义对象。 请参考以下操作,该操作返回自定义 Product 对象的集合:

 [HttpGet]
 public Task<List<Product>> Get() =>
    _productContext.Products.OrderBy(p => p.Name).ToListAsync();

2、返回 IEnumerable<T> 或 IAsyncEnumerable<T>

C# 中如果需要使用关键字 foreach 去迭代(轮询)一遍一个集合的内容,那么就需要这个类实现IEnumerable接口

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }

3、IActionResult 类型

 

当操作中可能有多个 ActionResult 返回类型时,适合使用 IActionResult 返回类型。 ActionResult 类型表示多种 HTTP 状态代码。 派生自 ActionResult 的任何非抽象类都限定为有效的返回类型。 此类别中的某些常见返回类型为 BadRequestResult (400)、NotFoundResult (404) 和 OkObjectResult (200)。 或者,可以使用 ControllerBase 类中的便利方法从操作返回 ActionResult 类型。 例如,return BadRequest(); 是 return new BadRequestResult(); 的简写形式。

 

由于此操作类型中有多个返回类型和路径,因此必须自由使用 [ProducesResponseType] 特性。 此特性可针对 Swagger 等工具生成的 Web API 帮助页生成更多描述性响应详细信息。 [ProducesResponseType] 指示操作将返回的已知类型和 HTTP 状态代码。

[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(Product))]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetById_IActionResult(int id)
{
    var product = _productContext.Products.Find(id);
    return product == null ? NotFound() : Ok(product);
}

4、ActionResult<T> 类型

[HttpGet]
public ActionResult<IEnumerable<Product>> Get() =>
    _repository.GetProducts();

大多数操作具有特定返回类型。 执行操作期间可能出现意外情况,不返回特定类型就是其中之一。 例如,操作的输入参数可能无法通过模型验证。 在此情况下,通常会返回相应的 ActionResult 类型,而不是特定类型。

5、HttpResults 类型

6、 IResult 类型

命名空间 Microsoft.AspNetCore.Http.HttpResults 包含实现 接口的 IResult 类。 IResult 接口定义一个表示 HTTP 终结点结果的协定。 静态 Results 类用于创建各种 IResult 对象,这些对象表示不同类型的响应。

[HttpGet("{id}")]
[ProducesResponseType(typeof(Product), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IResult GetById(int id)
{
    var product = _productContext.Products.Find(id);
    return product == null ? Results.NotFound() : Results.Ok(product);
}