考虑以下两段代码。两者都将数据返回到Web API Get调用。两者都返回一个项目列表。两者都有效。第一个是从Visual Studio入门版Blazor Wasm应用程序中截取的。第二个是从网上教程中截取的。tblTitles是远程数据库中的一个表,通过_dataContext进行访问。
应该使用以下哪一种?为什么?或者可能更适合特定情况?
[HttpGet]
//First method:
public IEnumerable<TitlesTable> Get()
{
var titles = _dataContext.tblTitles.ToList();
return titles;
}
//Second method:
public async Task<IActionResult> Get()
{
var titles = await _dataContext.tblTitles.ToListAsync();
return Ok(titles);
}
我相信您注意到了不同的可用控制器返回类型。从文档页面:
ASP。NET Core为web API控制器提供以下选项动作返回类型:
- 特定类型
IActionResult
ActionResult<T>
该页面提供了何时使用每种方法的注意事项。
您的代码段之间有两个差异,应该分别考虑。
1.同步或异步
大多数操作都会进行一些I/O操作,异步/等待模式是处理这些操作的首选模式,它将允许您的服务器处理更多的并发请求。
2.纯数据或IActionResult
直接返回数据是在询问ASP。NET为您包装一个响应。这很容易,但一旦您尝试添加验证,就会出现问题。任何错误都将返回状态500(内部服务器错误(,设计良好的API应能够返回400(错误请求(或404(未找到((如果适用(。
因此,总之,async Task<IActionResult>
或async Task<ActionResult<T>>
是控制器操作的最佳模式。
第一个来自Visual Studio入门版Blazor Wasm应用程序。
不,不是。演示控制器生成一些天气数据,但不进行任何I/O。
这使得所选的简短形式可以接受,但认为它具有"演示"质量水平。
两者相同。默认情况下,如果没有指定属性,asp.net会将操作方法视为HttpGet。现在两者都返回一个列表,但您也应该考虑将特定的状态代码作为api的一部分返回。通过这种方式,客户端应用程序可以了解请求发生了什么
IMHO,我会为你的api 采用这种方法
[HttpGet]
public async Task<IActionResult> Get()
{
var titles = await _dataContext.tblTitles.ToListAsync();
return Ok(titles);
}
您可以返回一个特定的类型,而不是IActionResult,后者是通用表示,但只有当您需要使用开放api标准为您的api生成文档时,您才会看到它的优势。像swashbuckle这样的包通过反射检查返回类型,以在文档上生成正确的输出模型。希望这能帮助