真正的MVC框架中具有一个名为IActionResult的重要结构,顾名思义,IActionResult对象一般会作为Action方法的返回值,针对请求的响应任务基本上会由这个对象来实现。...,为了使Action执行流程(执行Action方法=>将返回值转化成IActionResult对象=>执行IActionResult对象)显得明确而清晰,我们定义了如下这个“什么都没做”的NullActionResult...如果Action方法的返回值是一个Task或者ValueTask对象,它们的Result属性返回的参数这个待转换的数据对象。...在执行了目标Action方法并得到原始的返回值后,我们调用了ToActionResultAsync方法将返回值转换成Task,最终通过执行IActionResult对象进而完成所有的请求处理任务..., returnType)); } } 从上面的代码片段可以看出,在进行针对IActionResult的类型转换过程中使用到的IActionResultTypeMapper对象是从针对当前请求的依赖注入容器中提取的
如果是异步则使用Task。...同样异步的话使用Task包起来做为返回值。...return Ok(); } public async Task AsyncCall() { await...同样异步的话使用Task包起来做为返回值。...总结 大部分时候Action的返回值可以使用ActionResult/IActionResult 设计restful api的时候可以直接使用POCO类作为返回值 如果要设计既支持POCO类返回值或者ActionResult
从如下所示的输出结果可以看出,由于Action方法Bar采用“特性路由”,所以对应的ActionDescriptor分别对应着一个终结点。...Execute方法的返回值就是执行目标Action方法的返回值。...如代码片段所示,IActionResultConverter接口的唯一方法ConvertAsync方法会将作为Action方法返回值的Object对象转化成ValueTask(VoidActionResult.Instance); } // Task if (result is Task<IActionResult...; } public static async ValueTask ConvertFromTask(Task task) {
下面看几个异步方法: 6.Task类型 public async Task GetTaskNoResult() { await Task.Run(() => { });...以Action是同步还是异步以及Action的返回值类型为筛选条件,具体这部分内容见图 14‑2所示XXXResultExecutor列表及其后面的筛选逻辑部分。...从筛选规则是以Action的同步、异步以及Action的返回值类型来看,这么多种XXXResultExecutor就是为了处理不同的Action类型。...protected virtual async Task InvokeResultAsync(IActionResult result) { var actionContext = _actionContext...但是从第一节的例子可知,string类型会返回string类型的字符串,而Book这样的实体类型却会返回JSON。
GetOrderByIdRequestModel:IRequest { public string OrderId { get; set; } } //返回值...public interface IRequest : IBaseRequest{} //无返回值 public interface IRequest : IRequest...return Task.FromResult(request.UserId); } } 正如下代码片段,处理程序实现了IRequestHandler带有输入和输出类型定义的接口... Post([FromBody]CreateOrderRequestModel requestModel) { var response... Get([FromQuery]GetOrderByIdRequestModel requestModel) { var response
当然,不是所有的情况下,结果都是返回ObjectResult哦,就如同下面这些情况: 当我们显式返回一个IActionResult的时候 当Action的返回类型为Void,Task等没有返回结果的时候...从图中我们就可以看出,我们通常在处理一个文件的时候,就不是返回ObjectResult了,而是返回FileResult。还有其它没有返回值的情况,或者身份验证的情况。...public interface IActionResult { Task ExecuteResultAsync(ActionContext context); } 每一个具体的IActionResult...这样我们就从一个Action返回结果到了我们从POSTMan中看到的结果。 返回结果包装 在有了上面的知识基础之后,我们就可以考虑怎么样来实现将返回的结果进行自动包装。...context.HttpContext.Response.StatusCode; 原因是IAsyncResultFilter在执行时,context.HttpContext.Response的具体返回内容还没有被写入,所以只会有一个200的值,而真实的返回值现在都还在
我们将五个参数组合成一个匿名对象作为返回值。...我们在发送的请求中以查询字符串的形式提供对应的表达式“(123,456)”,从返回的内容可以看出参数得到了成功绑定。...如果返回类型为Void、Task或者ValueTask,均表示没有返回值。...对于其他类型的返回值(包括Task或者ValueTask),默认情况都会序列化成JSON作为响应的主体内容,响应的媒体类型会被设置为“application/json”,即使返回的是原生类型...定义在Controller类型中的Action方法一般返回会IActionResult(或者Task和ValueTask)对象。
CreateEntityPermission([FromBody] CreateEntityPermissionRequest request) { var permission... FindUserPermission(string username) { return Ok(await _userPermission.FindUserPermission...(username)); } [Route("role/{roleName}")] [HttpGet] public async Task FindRolePermission...(role, permission); return Ok(); } [Route("addtouser")] [HttpPost] public async Task<IActionResult...需要使用 IAuthorizationMiddlewareResultHandler IAuthorizationMiddlewareResultHandler 是授权管理里面的一个 Handler,可以从
使用 IEumerable 或 IAsyncEnumerable 作为返回值 在 Action 中返回 IEumerable 将会被序列化器中进行同步迭代 。...有关更多信息,请参阅 Controller Action 的返回值类型。...public class GoodReadController : Controller { [HttpPost("/form-body")] public async Task<IActionResult...当 Task 从调用链完成并返回时,HttpContext 就会被回收。...[HttpGet("/fire-and-forget-1")] public IActionResult BadFireAndForget() { _ = Task.Run(async () =
这种集合类增删改的思路应该是这样的: 1.从传进来的集合找出所有新添加的数据(新添加的数据Id通常并不存在, 这是条件), 放在一个临时的集合, 然后添加到context. 2.从数据库集合找出所有需要删除的数据...(有一些id在传进来的集合找不到的就是), 放在一个集合, 然后从conetxt一次性移除. 3.两个集合都有的数据就是只需要修改内容的数据, 更新即可.... Get(int id) { var model = await repostiory.GetTvNetworkByIdAsync(... Post([FromBody]TvNetworkUpdateViewModel vm) { if (!... Put(int id, [FromBody]TvNetworkUpdateViewModel vm) { if (!
async Task Mdi() { return View(); } public async Task<IActionResult...return View(); } public async Task Top() { return View(); }...View(); } [Route("OverView/Expander")] public async Task Expander()...{ return View(); } [Route("OverView/Gif")] public async Task Gif(...")] public async Task ProgressBar() { return View(); } [Route
IUserService userService) { _userService = userService; } public IActionResult...public async Task Login(string password) { if (password == "123")...这个扩展方法同样是在IAuthenticationService里,所以测试代码跟上面的SignInAsync类似,只是需要对AuthenticateAsync继续mock返回值success or fail...public async Task Login() { if ((await HttpContext.AuthenticateAsync...return Redirect("/login"); } 测试用例: [TestMethod()] public async Task
CreateAuthorAsync(AuthorForCreationDto authorForCreationDto) { var author = Mapper.Map... AddBookAsync(Guid authorId, BookForCreationDto bookForCreationDto) { var book = Mapper.Map...destination, Type sourceType, Type destinationType); 它能将源映射到一个已经存在的对象,重载是为了将 BookForUpdateDto 映射到已经从数据库中获取到的...Book 实体 [HttpPut("{bookId}")] public async Task UpdateBookAsync(Guid authorId, Guid bookId... PartiallyUpdateBookAsync(Guid authorId, Guid bookId, JsonPatchDocument<BookForUpdateDto
处理这些情况是非常琐碎,我们需要做的是在返回我们的自定义视图之前设置状态代码: public async Task<IActionResult GetProduct(int id) {...viewName; StatusCode = (int)HttpStatusCode.NotFound; } } 这简化了我们的Action: public async Task...<IActionResult GetProduct(int id) { var viewModel = await _db.Get<Product,GetProductViewModel...虽然全部路由将处理404,但下一个方式将处理任何非成功状态代码,以便您可以执行以下Action(可能在生产中的Action过滤器中): public async Task<IActionResult...当从内部中间件组件返回错误代码(如404)时,UseStatusCodePagesWithReExecute允许您执行另一个控制器Action来处理状态代码。
比如爬虫并行从网上抓取内容的时候,就要根据情况限制最大执行的线程的数量。...(tasks); tasks.Clear(); } } 这里遍历所有单词,抓取单词并且保存到磁盘的Process方法的返回值Task没有使用await关键字进行修饰...这样以后客户端再查询这个单词,就可以直接从文件服务器查询了。...如下代码是错误的: public async Task TestSleep() { await System.IO.File.ReadAllTextAsync...如下是正确的: public async Task TestSleep() { await System.IO.File.ReadAllTextAsync(
Topics(int id) { List topicModels = new List Topics([FromBody] TopicModel topicModel) { bool res = true;...} return new JsonResult(num); } [HttpPut] public async Task... Topics(int id,[FromBody]TopicModel topicModel) { bool res = true;... TopicTerms(int id) { if (id > 0) { var
异步操作时需要注意的要点 1.使用异步方法返回值应当避免使用void 在使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点 无法得知异步函数的状态机在什么时候执行完毕...return await response.Content.ReadAsStreamAsync(); } } 所以应该及时的释放CancellationSoure,使得正确的从队列中删除计时器...ConcurrentDictionary(); public PersonController(AppDbContext db) { _db = db; } public IActionResult...db) { _db = db; } public async Task Get(int id) { // 因为缓存的是线程本身... Get(int id) { // 使用Lazy进行了延迟加载(使用时调用),解决了多次执行回调问题 var person = await
异步操作时需要注意的要点 1.使用异步方法返回值应当避免使用void 在使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点 无法得知异步函数的状态机在什么时候执行完毕...return await response.Content.ReadAsStreamAsync(); } } ☑️所以应该及时的释放CancellationSoure,使得正确的从队列中删除计时器...(); public PersonController(AppDbContext db) { _db = db; } public IActionResult...db) { _db = db; } public async Task Get(int id) { // 因为缓存的是线程本身... Get(int id) { // 使用Lazy进行了延迟加载(使用时调用),解决了多次执行回调问题 var
领取专属 10元无门槛券
手把手带您无忧上云