C# WebAPI的几种返回类型方式

 更新时间:2025年11月27日 10:49:57   作者:她说彩礼65万  
本文主要介绍了C# WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 ASP.NET Core 中有三种返回 数据 和 HTTP状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示:

     [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet]
        public IEnumerable Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
 

除了这种,也可以返回 IActionResult 实例 和 ActionResult 实例。

虽然返回指定的类型 是最简单粗暴的,但它只能返回数据,附带不了http状态码,而 IActionResult 实例可以将 数据 + Http状态码 一同带给前端,最后就是 ActionResult 它封装了前面两者,可以实现两种模式的自由切换。

接下来一起讨论下如何在 ASP.NET Core Web API 中使用这三种方式。

创建 Controller 和 Model 类

在项目的 Models 文件夹下新建一个 Author 类,代码如下:

  public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
 

有了这个 Author 类,接下来创建一个 DefaultController 类。

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
 
namespace IDGCoreWebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DefaultController : ControllerBase
    {
        private readonly List authors = new List();
        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 Get()
        {
            return authors;
        }
 
        [HttpGet("{id}", Name = "Get")]
        public Author Get(int id)
        {
            return authors.Find(x => x.Id == id);
        }
    }
}
 

在 Action 中返回 指定类型

最简单的方式就是在 Action 中直接返回一个 简单类型 或者 复杂类型,其实在上面的代码清单中,可以看到 Get 方法返回了一个 authors 集合,看清楚了,这个方法定义的是 IEnumerable

[HttpGet]
public IEnumerable Get()
{
   return authors;
}

在 ASP.NET Core 3.0 开始,你不仅可以定义同步形式的 IEnumerable方法,也可以定义异步形式的 IAsyncEnumerable方法,后者的不同点在于它是一个异步模式的集合,好处就是 不阻塞 当前的调用线程,关于 IAsyncEnumerable 更多的知识,我会在后面的文章中和大家分享。

下面的代码展示了如何用 异步集合 来改造 Get 方法。

[HttpGet]
public async IAsyncEnumerable Get()
{
   var authors = await GetAuthors();
   await foreach (var author in authors)
   {
        yield return author;
   }
}

在 Action 中返回 IActionResult 实例

如果你要返回 data + httpcode 的双重需求,那么 IActionResult 就是你要找的东西,下面的代码片段展示了如何去实现。

[HttpGet]
public IActionResult Get()
{
  if (authors == null)
      return NotFound("No records");
 
  return Ok(authors);
}

上面的代码有 OkNotFound 两个方法,对应着 OKResult,NotFoundResult, Http Code 对应着 200,404。当然还有其他的如:CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult, 和 UnsupportedMediaTypeResult,都是 IActionResult 的子类。

在 Action 中返回ActionResult实例

ActionResult 是在 ASP.NET Core 2.1 中被引入的,它的作用就是包装了前面这种模式,怎么理解呢? 就是即可以返回 IActionResult ,也可以返回指定类型,从 ActionResult 类下的两个构造函数中就可以看的出来。

public sealed class ActionResult : IConvertToActionResult
{
	public ActionResult Result  {get;}
 
	public TValue Value  {get;}
 
	public ActionResult(TValue value)
	{
		if (typeof(IActionResult).IsAssignableFrom(typeof(TValue)))
		{
			throw new ArgumentException(Resources.FormatInvalidTypeTForActionResultOfT(typeof(TValue), "ActionResult"));
		}
		Value = value;
	}
 
	public ActionResult(ActionResult result)
	{
		if (typeof(IActionResult).IsAssignableFrom(typeof(TValue)))
		{
			throw new ArgumentException(Resources.FormatInvalidTypeTForActionResultOfT(typeof(TValue), "ActionResult"));
		}
		Result = (result ?? throw new ArgumentNullException("result"));
	}
}

有了这个基础,接下来看看如何在 Action 方法中去接这两种类型。

[HttpGet]
public ActionResult> Get()
{
  if (authors == null)
       return NotFound("No records");
   return authors;
}

和文章之前的 Get 方法相比,这里直接返回 authors 而不需要再用 OK(authors) 包装,是不是一个非常好的简化呢? 接下来再把 Get 方法异步化,首先考虑下面返回 authors 集合的异步方法。

private async Task> GetAuthors()
{
    await Task.Delay(100).ConfigureAwait(false);
    return authors;
}

值得注意的是,异步方法必须要有至少一个 await 语句,如果不这样做的话,编译器会提示一个警告错误,告知你这个方法将会被 同步执行,为了避免出现这种尴尬,我在 Task.Delay 上做了一个 await。

下面就是更新后的 Get 方法,注意一下这里我用了 await 去调用刚才创建的异步方法,代码参考如下。

[HttpGet]
public async Task>> Get()
{
   var data = await GetAuthors();
   if (data == null)
        return NotFound("No record");
   return data;
}

如果你有一些定制化需求,可以实现一个自定义的 ActionResult 类,做法就是实现 IActionResult 中的 ExecuteResultAsync 方法即可。

到此这篇关于C# WebAPI的几种返回类型方式的文章就介绍到这了,更多相关C# WebAPI返回类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#自定义事件之属性改变引发事件示例

    C#自定义事件之属性改变引发事件示例

    这篇文章主要为大家详细介绍了C#自定义事件之属性改变引发事件示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C#窗体实现点餐系统

    C#窗体实现点餐系统

    这篇文章主要为大家详细介绍了C#窗体实现点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 详解C++中类的大小决定因数

    详解C++中类的大小决定因数

    类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • c# 实现RSA非对称加密算法

    c# 实现RSA非对称加密算法

    RSA解决了对称加密的一个不足,比如AES算法加密和解密时使用的是同一个秘钥,因此这个秘钥不能公开,因此对于需要公开秘钥的场合,我们需要在加密和解密过程中使用不同的秘钥,加密使用的公钥可以公开,解密使用的私钥要保密,这就是非对称加密的好处。 
    2021-06-06
  • c# Process.Start()找不到系统文件的解决方法

    c# Process.Start()找不到系统文件的解决方法

    vs1027在X64应用程序下执行process.start()时,OK;但是在X86应用程序下执行process.start(),报错:找不到系统文件,本文就详细的介绍一下解决方法,感兴趣的可以了解一下
    2023-09-09
  • 基于C#实现屏幕取色器的示例详解

    基于C#实现屏幕取色器的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现屏幕取色器,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#判断一个图像是否是透明的GIF图的方法

    C#判断一个图像是否是透明的GIF图的方法

    这篇文章主要介绍了C#判断一个图像是否是透明的GIF图的方法,涉及C#针对gif图片属性的相关操作技巧,需要的朋友可以参考下
    2015-06-06
  • C#泛型运作原理的深入理解

    C#泛型运作原理的深入理解

    这篇文章主要给大家介绍了关于C#泛型运作原理的深入理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C#使用Mutex简单实现程序单实例运行的方法

    C#使用Mutex简单实现程序单实例运行的方法

    这篇文章主要介绍了C#使用Mutex简单实现程序单实例运行的方法,涉及C#实现单实例程序运行的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • C#实现textbox文本多行输出且自动换行输出

    C#实现textbox文本多行输出且自动换行输出

    在WinForms中通过设置TextBox的Multiline和WordWrap属性实现多行输出且自动换行,可以通过设计器或代码设置以上两个属性,文本输出方法包括直接赋值、追加文本和循环输出,完整示例代码展示了设计器设置后的代码实现,需要的朋友可以参考下
    2026-04-04

最新评论