我们有三种方法可以从ASP.NET Core中的操作方法返回数据和HTTP状态代码。 您可以返回特定类型,返回IActionResult类型的实例,或者返回ActionResult类型的实例。
尽管返回特定类型是最简单的方法,但IActionResult允许您同时返回数据和HTTP代码,而ActionResult <T>则允许您返回扩展IActionResult的类型。 ActionResult可用于从操作方法发送HTTP状态代码,数据或两者。
[ 也在InfoWorld上:微软开发人员工具和技术将在2020年进行探索 ]
本文讨论了如何使用每种类型的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项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.Net Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在接下来显示的“创建新的ASP.Net Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。 我将在这里使用ASP.NET Core 3.0。
- 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
这将在Visual Studio中创建一个新的ASP.NET Core API项目。 现在,在“解决方案资源管理器”窗口中选择Controllers解决方案文件夹,然后单击“添加-> Controller…”以创建一个名为DefaultController的新控制器。 在本文的后续部分中,我们将使用该项目来探索从操作方法返回的数据。
如果您想要一种简单的方法来测试我们下面使用的操作方法,我建议您利用Postman。 您可以从此处下载Postman的副本 。
[ 同样在InfoWorld上:如何在ASP.NET Web API中记录请求和响应元数据 ]
在ASP.NET Core中创建Controller和Model类
创建一个新的解决方案文件夹并将其命名为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);
}
}
}
[ 同样在InfoWorld上:什么是CI / CD? 持续集成和持续交付的解释 ]
从ASP.NET Core中的操作方法返回特定类型
从操作方法返回数据的最简单方法是返回特定类型。 在上面显示的代码清单中,Get操作方法返回Author实例的列表。 这些实例是在DefaultController类的构造函数中创建和初始化的。 下面再次是操作方法,供您参考。 请注意,它返回IEnumerable <Author>。
[HttpGet]
public IEnumerable<Author> Get()
{
return authors;
}
从ASP.NET Core 3.0开始,您还可以选择从操作方法返回IAsyncEnumerable <T>。 IEnumerable <T>执行同步集合迭代,而IAsyncEnumerable <T>执行异步迭代。 由于没有阻塞调用,因此IAsyncEnumerable <T>效率更高。 (我将在以后的文章中进一步讨论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类型的实例。
[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]
从ASP.NET Core中的操作方法返回类型为ActionResult <T>的实例
ASP.NET Core 2.1中引入了ActionResult <T>。 ActionResult是一种实现IActionResult接口的类型。 您可以利用ActionResult <T>返回类型来返回扩展ActionResult的类型或任何其他特定类型(例如本例中的Author)。
以下代码段说明了如何从操作方法返回ActionResult <T>。
[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关键字来调用我们刚刚创建的async方法。
[HttpGet]
public async Task<ActionResult<IEnumerable<Author>>> Get()
{
var data = await GetAuthors();
if (data == null)
return NotFound("No record");
return data;
}
[ 也在InfoWorld上:用于AI开发的6种最佳编程语言 ]
您还可以从操作方法返回自定义ActionResult的实例。 您需要做的就是创建一个实现IActionResult接口并实现ExecuteResultAsync方法的类。 我们将在以后的文章中讨论IActionResult和ActionResult以及自定义ActionResult类。
From: https://www.infoworld.com/article/3520770/how-to-return-data-from-aspnet-core-web-api.html