一、概览
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不继承任何类。
三、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格式
五、返回值: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错误");
}
}
}
}
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错误,并返回具体错误信息
六、返回值: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>类型