ASP.NET Core这个HttpContextAccessor为什么改成了这个样子?
-
关于HttpContext其实我们大家都不陌生,HttpContext 就是关于 Http请求过程中涉及到的所有变量或者引用存放的一个仓库。 类似的我们还有 DbContext, ApplicationContext 。它封装了HttpRequest和HttpResponse,在处理Http请求时,起着至关重要的作用。
那么如何访问HttpContext对象呢?回到await/async出现以前的ASP.NET的时代,我们可以通过HttpContext.Current方法直接访问当前Http请求的HttpContext对象,因为当时基本都是同步的代码,一个Http请求只会在一个线程中处理,所以我们可以使用能在当前线程中传播的CallContext.HostContext来保存HttpContext对象,
一切都很美好,但是后面微软在C#为了进一步增强增强了异步IO的性能,从而实现的stackless协程,加入了await/async关键字,同一个方法内的代码await前与后不一定在同一个线程中执行,那么就会造成在await之后的代码使用HttpContext.Current的时候访问不到当前的HttpContext对象,下面有一段这个问题简单的复现代码。
await执行之前HostContext是可以正确的输出赋值的对象和数据,但是await以后的代码由于线程从16切换到29,所以访问不到上面代码给HostContext设置的对象了。
AsyncLocal默认会将当前线程保存的上下对象在发生await的时候传播到后续的线程上。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏