asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计
如果一个Controller.Action里的处理非常耗时,比如读数据库、文件操作、调用第三方接口等
此时用户随时可能关闭浏览器、F5刷新网页等操作。
但是服务端的耗时代码任然在执行,这太浪费了,既然用户终止请求了,我们就应该取消所有的耗时操作
在.net开发中,几乎所有的异步方法都有个CancellationToken类型的参数,只要我们传入此令牌,将来我们随时可以通过此令牌取消异步操作
而asp.net中HttpContext提供了一个RequestAborted属性,它就是CancellationToken类型,当用户以任何方式终止请求时, HttpContext.RequestAborted就会触发取消
所以如果我们在异步方法中都传入这个参数,就能实现当用户终止请求时,我们所有的异步操作都会立即取消
并发大的情况下,这个操作很重要。
参考代码:
1 public async Task<ActionResult> TestAsync()
2 {
3 await System.IO.File.ReadAllTextAsync(@"d:\a.txt", HttpContext.RequestAborted);
4 //....略
上面是asp.net默认行为,你会发现一个问题,真个应用程序有铺天盖地的异步方法,如果都想实现上述特征 我们所有的异步方法都得加上CancellationToken参数
abp提供了一种牛X的方式
它提供一个ICancellationTokenProvider接口,它会为我们提供一个CancellationToken对象,所以我们定义的异步方法不需要定义CancellationToken参数了,首先在我们的类中依赖注入这个接口,然后在调用.net内置库或第三方库的异步方法时,传入ICancellationTokenProvider.Token就可以了,如下:
1 ICancellationTokenProvider CancellationTokenProvider ;
2
3 //构造函数注入CancellationTokenProvider 略...
4
5 public override async Task<List<TEntity>> GetAllListAsync()
6 {
7 return await GetAll().ToListAsync(CancellationTokenProvider.Token);
8 }
比较推荐的是使用“空模式”,用属性注入,如下:
1 public ICancellationTokenProvider CancellationToken { get; set; } = NullCancellationTokenProvider.Instance;
abp中最终使用的是HttpContextCancellationTokenProvider,它的Token属性返回的就是HttpContext.RequestAborted
默认情况下abp的Repository中的所有异步方法已经使用这种模式,由于我们开发是大部分情况下都是数据库读写,所以我们在abp中几乎可以不关心这事,默认就是以合理的方式运行的。
但有时候我们需要做其它异步操作,比如调用第三方接口啥的,此时就需要通过上面的方式来实现这种 用户取消请求则所以异步操作理解取消的效果。
在某些场景中我们可能并不想用这种默认的行为,而是希望传入自己的CancellationToken对象,而不是用HttpContext的。这是我估计ICancellationTokenProvider.Use就派上用场了。怎么用呢?
asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计的更多相关文章
- C#  ASP.NET Core使用HttpClient的同步和异步请求
		
引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...
 - asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
		
前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...
 - asp.net core系列 47 Identity 自定义用户数据
		
一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...
 - ASP.NET Core奇遇记:无用户访问,CPU却一直100%
		
这是5月11日遇到的一个问题,1台1核1G阿里云Linux服务器运行着生产环境中的ASP.NET Core站点,出现CPU 100%问题. 开始以为是这台服务器负载高引起的,于是将这台服务器从负载均衡 ...
 - asp dotnet core 通过图片统计 csdn 用户访问
		
在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...
 - 使用ASP.NET Core开发信息采集系统将用户数据添加至企业微信
		
一.启动Visual Studio 2019,创建ASP.NET Core Web应用程序 二.在Models文件夹添加新项 Person.cs using System.ComponentModel ...
 - asp.net core 3.x 微信小程序登录库(也可用于abp)
		
视频教程(使用+实现原理):https://share.weiyun.com/57HKopT 建议直接看视频 源码地址:https://github.com/bxjg1987/abpGeneralMo ...
 - 【ASP.NET Core快速入门】(六)配置的热更新、配置的框架设计
		
配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...
 - Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)
		
一.在使用Asp.net WebAPI 或Asp.Net Core WebAPI 时 ,如果使用了Delete请求谓词,本地生产环境正常,线上发布环境报错. 服务器返回405,请求谓词无效. 二.问题 ...
 - IE内核发送ajax请求时不会将url中的参数编码
		
有一次用户遇到创建文件,名称为中文时乱码的问题. 经调查,发现用户使用的是国产浏览器ie模式 抓取请求发现 IE: 键 值请求 POST /Handlers/CreateTxtFile.ashx?fi ...
 
随机推荐
- 蓝屏攻击 MS12-020
			
目录 1.蓝屏攻击 MS12-020 搜索对应活跃主机win7蓝屏漏洞端口 Nessus 执行漏洞扫描 Metasploit 漏洞利用 msfconsole Armitage 1.蓝屏攻击 MS12- ...
 - 部署包含Oracle数据源的项目
			
这段时间在处理公司EAS的数据报表,需要通过ETL进行数据的抽取,当ETL都完成并在本地跑成功后,总以为万事大吉了,没想到部署到作业后,却一直无法成功,百度搜索了好多方法,跟着上面去操作还是一直报错, ...
 - Nginx增加网页认证功能
			
Nginx增加网页认证功能 增加认证功能模块 ngx_http_auth_basic_module 模块实现让访问者,只有输入正确的用户密码才允许访问web内容.web上的一些内容不想被其他人知道,但 ...
 - jenkins拉取github代码报错问题解决
			
问题起因: 踩坑踩坑 用jenkins拉取github项目的代码时,配置完成点击构建时,报错信息为:Couldn't find any revision to build. Verify the re ...
 - Redis中常见的数据类型及其应用场景
			
五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String.List等类型进行存储. 各数据类型介绍: R ...
 - 能不能用uni开发一个线上运动会的APP、小程序?
			
引言:uni-app凭借其强大的跨平台能力,成为开发AI运动类APP和小程序的首选框架.本文旨在探讨基于uni进行开发AI运动小程序.APP开发,以及开发过程中遇到的技术难点,并为您介绍一个开箱即用的 ...
 - think in java interview-高级开发人员面试宝典(二)
			
从现在开始,以样题的方式一一列出各种面试题以及点评,考虑到我在前文中说的,对于一些大型的外资型公司,你将会面临全程英语面试,因此我在文章中也会出现许多全英语样题. 这些题目来自于各个真实的公司,公司名 ...
 - Getting Flex 3 talking to Java via JSON
			
packagecom.giantflyingsaucer; importjava.io.*; importjava.io.PrintWriter; importjavax.servlet.*; imp ...
 - 关于xml文件解析时'&'不能被解析的问题
			
Bug情况:在解析xml文件的时候,&字符解析错误 解决方式:将符号进行转义
 - C# 获取系统盘符
			
1.使用.net管理对象(引入System.Management) public static List<string> getDisk() { WqlObjectQuery wmique ...