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

标签 c# asp.net-core .net-core asp.net-core-webapi

我有以下用例用于 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/

相关文章:

javascript - 如何使用正则表达式解析OData参数?

angular - 如何在 [FromBody] ASP.NET CORE 2 和 Angular 5 中接收文件

c# - 将 ZipArchive 与 ASP.NET Core Web Api 结合使用

c# - 如何在单元测试期间跳过 Fluent 验证静态函数?

c# - 使用 log4net 将异常记录到数据库

c# - 无法从 List 转换为 EntityCollection

localization - 带有新 csproj 的 .NET Standard (1.4) 中的资源文件

linux - 如何在 Linux Azure Function 启动命令上安装 libgdiplus apt 包?

c# - 如何在不使用鼠标的情况下执行虚拟鼠标单击 C#

c# - 传递空回调 Blazor