如何从 ASP.NET Core Web API 返回数据 了解三种方式

了解从 ASP.NET Core Web API 操作方法返回数据的三种方式。

    在 ASP.NET Core 中,我们有三种方法可以从操作方法返回数据和 HTTP 状态代码。您可以返回特定类型、返回 IActionResult 类型的实例或返回 ActionResult 类型的实例。 

    虽然返回特定类型是最简单的方法,但 IActionResult 允许你同时返回数据和 HTTP 代码,并且 ActionResult让您返回扩展 IActionResult 的类型。ActionResult 可用于从操作方法发送 HTTP 状态代码、数据或两者。

    本文讨论了如何使用每种类型在 ASP.NET Core Web API 中返回数据,并提供 C# 中的相关代码示例。 

    要使用本文中所示的代码示例,您应该在系统中安装 Visual Studio 2019。如果您还没有,可以在此处下载 Visual Studio 2019。 

创建一个 ASP.Net Core API 项目

    首先,让我们在 Visual Studio 中创建一个 ASP.NET Core 项目。假设您的系统中安装了 Visual Studio 2019,请按照下面概述的步骤在 Visual Studio 中创建一个新的 ASP.NET Core 项目。

    1、启动 Visual Studio IDE。
    2、点击“创建新项目”。
    3、在“创建新项目”窗口中,从显示的模板列表中选择“ASP.Net Core Web 应用程序”。
    4、单击“下一步”。
    5、在“配置新项目”窗口中,指定新项目的名称和位置。
    6、单击“创建”。
    7、在接下来显示的“创建新的 ASP.Net Core Web 应用程序”窗口中,选择 .NET Core 作为运行时,并从顶部的下拉列表中选择 ASP.NET Core 2.2(或更高版本)。我将在这里使用 ASP.NET Core 3.0。
    8、选择“API”作为项目模板,创建一个新的 ASP.NET Core API 应用程序。
    9、确保未选中“启用 Docker 支持”和“配置 HTTPS”复选框,因为我们不会在这里使用这些功能。
    10、确保身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
    11、单击“创建”。

    这将在 Visual Studio 中创建一个新的 ASP.NET Core API 项目。现在在解决方案资源管理器窗口中选择 Controllers 解决方案文件夹,然后单击“添加 -> 控制器…”以创建一个名为 DefaultController 的新控制器。我们将在本文的后续部分中使用该项目来探索从操作方法返回数据。

    如果您想以一种简单的方式测试我们下面使用的操作方法,我建议您利用 Postman。您可以从此处下载 Postman 的副本。 

在 ASP.NET Core 中创建控制器和模型类

    创建一个新的解决方案文件夹并将其命名为 Models。您将在此处放置模型类。以下代码清单说明了如何创建一个名为 Author 的简单模型类。

public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

到目前为止一切顺利。现在,用下面给出的代码清单替换生成的 DefaultController 类的代码。

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace IDGCoreWebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DefaultController : ControllerBase
    {
        private readonly List<Author> authors = new List<Author>();
        public DefaultController()
        {
            authors.Add(new Author()
            {
                Id = 1,
                FirstName = "Joydip",
                LastName = "Kanjilal"
            });
            authors.Add(new Author()
            {
                Id = 2,
                FirstName = "Steve",
                LastName = "Smith"
            });
        }
        [HttpGet]
        public IEnumerable<Author> Get()
        {
            return authors;
        }
        [HttpGet("{id}", Name = "Get")]
        public Author Get(int id)
        {
            return authors.Find(x => x.Id == id);
        }
    }

从 ASP.NET Core 中的操作方法返回特定类型
        从操作方法返回数据的最简单方法是返回特定类型。在上面显示的代码清单中,Get 操作方法返回 Author 实例列表。这些实例是在 DefaultController 类的构造函数中创建和初始化的。下面再次给出操作方法供您参考。请注意,它返回 IEnumerable。 

[HttpGet]
public IEnumerable<Author> Get()
{
   return authors;
}
        从 ASP.NET Core 3.0 开始,你还可以选择返回 IAsyncEnumerable来自操作方法。而 IEnumerable执行同步集合迭代,IAsyncEnumerable执行异步迭代。因此 IAsyncEnumerable效率更高,因为没有阻塞调用。(我将在以后的文章中进一步讨论 IAsyncEnumerable。)

下面展示了如何使用 IAsyncEnumerable 重写前面的操作方法。

[HttpGet]
public async IAsyncEnumerable<Author> Get()
{
   var authors = await GetAuthors();
   await foreach (var author in authors)
   {
        yield return author;
   }
}

从 ASP.NET Core 中的操作方法返回 IActionResult 类型的实例
        当您想从操作方法中返回数据和 HTTP 代码时,可以利用 IActionResult 接口。以下代码片段说明了如何实现这一点。

[HttpGet]
public IActionResult Get()
{
  if (authors == null)
      return NotFound("No records");
  return Ok(authors);
}
IActionResult 接口由 OkResult、NotFoundResult、CreatedResult、NoContentResult、BadRequestResult、UnauthorizedResult 和 UnsupportedMediaTypeResult 类实现。

在上面的代码片段中,方法NotFound()和Ok()返回IActionResult类型的实例。

返回 ActionResult 类型的实例来自 ASP.NET Core 中的操作方法
        动作结果在 ASP.NET Core 2.1 中引入。ActionResult 是实现 IActionResult 接口的类型。您可以利用 ActionResult返回类型返回一个扩展 ActionResult 或任何其他特定类型(例如我们示例中的 Author)的类型。

以下代码片段说明了如何返回 ActionResult来自动作方法。

[HttpGet]
public ActionResult<IEnumerable<Author>> Get()
{
  if (authors == null)
       return NotFound("No records");
   return authors;
}
        正如您在前面的代码片段中看到的,您不再需要将要返回的对象包装在 Ok() 方法中 - 您可以按原样返回它。

        现在让我们将其变为异步。考虑以下异步方法,它返回作者列表。

private async Task<List<Author>> GetAuthors()
{
    await Task.Delay(100).ConfigureAwait(false);
    return authors;
}
        异步方法应至少包含一个 await 语句。如果没有任何 await 语句,编译器将生成警告,指出该方法将同步运行。为了避免出现此编译器警告,我在前面的代码片段中等待对 Task.Delay 方法的调用。

        更新后的操作方法如下所示。请注意,我们使用 await 关键字来调用我们刚刚创建的异步方法。

[HttpGet]
public async Task<ActionResult<IEnumerable<Author>>> Get()
{
   var data = await GetAuthors();
   if (data == null)
        return NotFound("No record");
   return data;

        您还可以从操作方法返回自定义 ActionResult 的实例。您需要做的就是创建一个实现 IActionResult 接口并实现 ExecuteResultAsync 方法的类。我们将在以后的文章中讨论 IActionResult 和 ActionResult 以及自定义 ActionResult 类。 

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值