当前位置: 首页>后端>正文

ASP.NET Core WebAPI的异步及返回值

一、概览

Part4-16:ASP.NETCore WebAPI的异步及返回值_哔哩哔哩_bilibili

二、控制器类

1、Web API中Controller默认继承ControllerBase类
2、MVC中Controller默认继承Controller类;Controller继承ControllerBase。
3、Web API中控制器类可以不显示地继承任何类(比如ControllerBase)

  • 在Web API中用添加API的方式创建类,默认继承ControllerBase

  • 在Web API中用添加类的方式创建类,默认没有任何继承,但是这不影响使用。

  • 在Web API中,Controller没有继承ControllerBase,属于ControllerBase的方法就无法使用(返回Ok、返回重定向等等)。

  • Controller不继承任何类的好处是:方便单元测试。(ps:类继承越多的父类,单元测试需要准备的环境就越多,单元测试就越麻烦)。但是一般情况下不用特别让Controller不继承任何类。


    ASP.NET Core WebAPI的异步及返回值,第1张
    添加API:文件夹>>右键>>添加
ASP.NET Core WebAPI的异步及返回值,第2张
添加类:文件>>邮件>>添加类

三、Action方法的异步

1、Action方法既可以同步也可以异步。
2、异步Action方法的名字一般不需要以Async结尾。
3、Web API中的Action方法的返回值如果是普通数据类型,那么返回值就会被默认序列化为Json格式。
4、Web API中的Action方法的返回值同样支持IActionResult类型,不包含类型信息,因此Swagger等无法判断出类型,所以推荐用ActionResult<T>,它支持类型转换,从而用起来更简单。
5、IActionResult主要是MVC中被使用比较多。

三、代码案例:异步方法

  • 功能:异步方法读取本地某个文件前20个字符
using Microsoft.AspNetCore.Mvc;

namespace Web1.Controllers
{
    [Route("[controller]/[action]")]
    [ApiController]
    public class HelloController
    {
        [HttpGet]
        public async Task<string> Add2()
        {
            string s = await File.ReadAllTextAsync("C:\Users\Raoli\Desktop\C#_MyProject\Web1\Web1\Hello.txt");
            return s.Substring(0, 20);
        }
    }
}

四、返回值:被序列化为Json格式

  • 实体类:Person2
namespace Web1
{
    public record Person2(long Id,string Name, String ChildrenNames);
}

  • 接口
using Microsoft.AspNetCore.Mvc;

namespace Web1.Controllers
{
    [Route("[controller]/[action]")]
    [ApiController]
    public class HelloController
    {
        [HttpGet]
        public Person2 Test2()
        {
            return new Person2(5, "杨中科", new string[] { "aaa", "bbb" });
        }
    }

}
  • 序列化json格式


    ASP.NET Core WebAPI的异步及返回值,第3张

五、返回值:IActionResult类型

1、IActionResult类型在MVC中使用的较多
2、代码案例:返回值是int类型,但是对于id不存在抛出异常

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Web1.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ReturnValueController : ControllerBase
    {
        [HttpGet]
        public int GetCJ(int id)
        {
            if (id==1)
            {
                return 88;
            }
            else if (id==2)
            {
                return 99;
            }
            else
            {
                throw new Exception("id错误");
            }
        }
    }
}

ASP.NET Core WebAPI的异步及返回值,第4张

3、优化2中代码,对于id不存在返回404,将返回值改成IActionResult类型

  • 代码:对于返回404错误,尽量把错误信息写到return NotFound("id错误");,便于前端排错。
  • 通过ControllerBase的Ok方法把返回数据转换成IActionResult类型。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Web1.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ReturnValueController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetCJ2(int id)
        {
            if (id == 1)
            {
                return Ok(88);
            }
            else if (id == 2)
            {
                return Ok(99);
            }
            else
            {
                return NotFound("id错误");
            }
        }
    }
}

  • 在Swagger界面验证GetCJ2方法:对于不符合要求的id报了404错误,并返回具体错误信息
    ASP.NET Core WebAPI的异步及返回值,第5张

六、返回值:ActionResult<T>类型

  • 因为IActionResult类型,不包含类型信息,Swagger等无法判断出类型,需要对所有return的正常值用Ok方法,所以在Web API中更推荐使用ActionResult<T>类型
  • 用ActionResult<T>类型优化五中的IActionResult类型
  • 不需要用Ok方法;比如以下代码,会自动把88转隐式转换成IActionResult类型
  • 代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Web1.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class ReturnValueController : ControllerBase
    {
        [HttpGet]
        public ActionResult<int> GetCJ3(int id)
        {
            if (id == 1)
            {
                return 88;
            }
            else if (id == 2)
            {
                return 99;
            }
            else
            {
                return NotFound("id错误");
            }
        }
    }
}

七、返回值总结

1、对于有可能返回非返回值的情况,报错、重定向之类,就用ActionResult<T>类型。
2、对于一定只会返回正常返回值的情况,就用普通类型,比较查询人数,一定是int类型,就用int类型做返回值类型。
3、在Web API中要么用普通类型、要么用ActionResult<T>类型


https://www.xamrdz.com/backend/3rc1935790.html

相关文章: