了解从 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 类。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。