博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net mvc中在使用async的时候HttpContext为null的问题
阅读量:7256 次
发布时间:2019-06-29

本文共 1381 字,大约阅读时间需要 4 分钟。

摘要

HttpContext上下文并不是无处不在的。详情可以看下Fish Li的文章,解释的比较清楚。

问题复现

public async Task
Home() { return await Task.Factory.StartNew(() => { var context = System.Web.HttpContext.Current; System.Web.HttpContext context2 = System.Runtime.Remoting.Messaging.CallContext.HostContext as HttpContext; return View(); }); }

比如有上面一段代码,你需要用到HttpContext,大部分人都会通过HttpContext.Current方式拿到当前请求的上下文。

但是

为什么拿不到上下文对象呢?

首先我们需要了解,HttpContext保存在哪儿?,在Fish Li的文章中已经说的很详细了,HttpContext其实是保存在CallContext.HostContext这个属性中的。

CallContext.HostContext

获取或设置与当前线程相关联的主机上下文。(MSDN)

当前线程: 当前线程是指与【当前请求】相关的线程。

其中Fish Li有这么段话解释的比较清楚

【当前线程】是个什么意思? 我为什么要突出这个词呢?

答:

1. 当前线程是指与【当前请求】相关的线程。
2. 在ASP.NET中,有些线程并非总是与请求相关。

感觉有点绕口吗? 不容易理解吗? 还是继续往下看吧。

虽然在ASP.NET程序中,几乎所有的线程都应该是为响应请求而运行的,

但是,还有一些线程却不是为了响应请求而运行,例如:
1. 定时器的回调。
2. Cache的移除通知。
3. APM模式下异步完成回调。
4. 主动创建线程或者将任务交给线程池来执行。

在以上这些情况中,如果线程执行到HttpContext.Current,您认为会返回什么?

还是一个HttpContext的实例引用吗?
如何是,那它与哪个请求关联?

显然,在1,2二种情况中,访问HttpContext.Current将会返回 null 。

因为很有可能任务在运行时根本没有任何请求发生。
了解异步的人应该能很容易理解第3种情况(就当是个结论吧)
第4种情况就更不需要解释了,因为确实不是当前线程。

猜测,task.factory.startnew,开启一个新的任务执行的。所以这里拿不到HttpContext也符合上述的情况。

那么我们可以在请求开始的时候可以通过变量将上下文保存起来,比如下面的方式。

总结

通过本篇文章,在异步中使用HttpContext.Current需要特别注意,它并不是无处不在的,所以在使用的时候,最好判断一下是否为null。

相关文章

Fish Li:

转载于:https://www.cnblogs.com/wolf-sun/p/5596015.html

你可能感兴趣的文章
hdu 2087 剪花布条【KMP】
查看>>
linux开发脚本自动部署及监控
查看>>
HTML+css实现图片全屏
查看>>
django+uwsgi+nginx配置及所出问题得解决
查看>>
应届生求职:IT博客真能当技术型职位的求职利器?
查看>>
冠状动脉造影图像分割
查看>>
毕业一年后的思考
查看>>
终于落脚了!
查看>>
MVC页面直接F5出错
查看>>
mysql 文件操作 表
查看>>
shell基础知识
查看>>
HLG 1050 Hot Pursuit II【次短路】
查看>>
css纯样式导航
查看>>
Mongodb数据迁移步骤
查看>>
测试题目
查看>>
Android之Pull解析XML
查看>>
NABCD模型需求分析
查看>>
java08双重循环打印图形
查看>>
类和对象的命名空间
查看>>
ADO.NET笔记——存储二进制大对象(BLOB)
查看>>