gpt4 book ai didi

c# - API Controller 的通用 ActionResult 返回类型

转载 作者:行者123 更新时间:2023-12-04 00:29:21 25 4
gpt4 key购买 nike

我有以下用例用于 GetProducts()方法。

好的路径:返回产品类型的数组:Product[]
错误路径:返回 500 的状态代码和描述性字符串错误消息。

( <?Type?> 下面是我自己的标记,用于这篇文章)

[Route("api/[controller]/[action]")]
[ApiController]
public class ProductsController : ControllerBase
{
[HttpGet]
public ActionResult<?Type?> GetProducts()
{
try
{
Product[] products = DataAccess.GetProductsFromDb();
return products;
}
catch
{
Response.StatusCode = 400;
return "Error retrieving products list"
}
}
}

有没有办法可以声明泛型类型或两种类型的操作结果,以便它可以工作?

最佳答案

您将返回一个 IActionResult。我强烈建议制作也是异步的。
以下是通过 Controller 方法返回任何内容的方法:

[Route("api/{controller}")]
public class ProductsController : Controller
{
[HttpGet]
public async Task<IActionResult> GetProducts()
{
var products = await DataAccess.GetProductsFromDb();
if (products is null)
{
return NotFound("Item not found!");
}
else
{
return Ok(products);
}
}
}
请注意 OkNotFoundController 中的方法抽象类,它允许您返回任何您想要的对象,或者根本不返回任何对象。
我强烈建议您在继续使用 .net core 之前快速查看 Visual Studio 中的示例项目模板,或者如果您正在另一个 IDE 中进行开发运行 dotnet new mvc在您的终端中。
如果你想处理一个异常,你应该在最低级别处理它。假设 GetProductsFromDb() 是最低级别并且您没有服务层(您以后会后悔这个设计选择!),您将尝试/捕获。
[Route("api/{controller}")]
public class ProductsController : Controller
{
[HttpGet]
public async Task<IActionResult> GetProducts()
{
Products[] products;
try
{
products = await DataAccess.GetProductsFromDb();
}
catch(Exception e)
{
Log.Error(e, "Unable to receive products");
return InternalServerError("Unable to retrieve products, please try again later");
}
if (!products.Any())
{
return NotFound("No products were found");
}
else
{
return Ok(products);
}
}
}
在大多数情况下,速度并不比稳定性更重要,在开发的这个阶段肯定不是。捕获异常的成本在如此高的级别上是微不足道的,特别是因为您的数据库调用将比捕获单个异常的开销慢几个数量级。

关于c# - API Controller 的通用 ActionResult 返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53615398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com