在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在网上查了好多资料,发现问这个问题的人多,回答的少,回答的也多数都是:引用System.Web,不要用HttpContext.Current.Application应该用System.Web.HttpContext.Current.Application,后来在网上看到一篇关于System.Runtime.Remoting.Messaging.CallContext这个类的详细介绍才知道,原来HttpContext.Current是基于System.Runtime.Remoting.Messaging.CallContext这个类,子线程和异步线程都无法访问到主线程在CallContext中保存的数据。所以在异步执行的过程会就会出现HttpContext.Current为null的情况,为了解决子线程能够得到主线程的HttpContext.Current数据,需要在异步前面就把HttpContext.Current用HttpContext的方式存起来,然后能过参数的形式传递进去,下面看看实现的方法:
public HttpContext context
{
get { return HttpContext.Current; }
set { context = value ; }
}
然后建立一个委托
public delegate string delegategetResult(HttpContext context);
下面就是实现过程的编码
在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在网上查了好多资料,发现问这个问题的人多,回答的少,回答的也多数都是:引用System.Web,不要用HttpContext.Current.Application应该用System.Web.HttpContext.Current.Application,后来在网上看到一篇关于System.Runtime.Remoting.Messaging.CallContext这个类的详细介绍才知道,原来HttpContext.Current是基于System.Runtime.Remoting.Messaging.CallContext这个类,子线程和异步线程都无法访问到主线程在CallContext中保存的数据。所以在异步执行的过程会就会出现HttpContext.Current为null的情况,为了解决子线程能够得到主线程的HttpContext.Current数据,需要在异步前面就把HttpContext.Current用HttpContext的方式存起来,然后能过参数的形式传递进去,下面看看实现的方法:
public HttpContext context
{
get { return HttpContext.Current; }
set { context = value ; }
}
然后建立一个委托
public delegate string delegategetResult(HttpContext context);
下面就是实现过程的编码
protected void Page_Load(object sender, EventArgs e)
{
context = HttpContext.Current;
delegategetResult dgt = testAsync;
IAsyncResult iar = dgt.BeginInvoke(context, null, null);
string result = dgt.EndInvoke(iar);
Response.Write(result);
}
public static string testAsync(HttpContext context)
{
if (context.Application["boolTTS"] == null)
{
Hashtable ht = (Hashtable)context.Application["TTS"];
if (ht == null)
{
ht = new Hashtable();
}
if (ht["A"] == null)
{
ht.Add("A", "A");
}
if (ht["B"] == null)
{
ht.Add("B", "B");
}
context.Application["TTS"] = ht;
}
Hashtable hts = new Hashtable();
hts = (Hashtable)context.Application["TTS"];
if (hts["A"] != null)
{
return "恭喜,中大奖呀";
}
else
{
return "我猜你快中奖了";
}
}
在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在网上查了好多资料,发现问这个问题的人多,回答的少,回答的也多数都是:引用System.Web,不要用HttpContext.Current.Application应该用System.Web.HttpC
回答的也多数都是:引用System.Web,不要用
Http
Context
.
Current
.
Application
应该用System.Web.
Http
Context
.
Current
.
Application
,后来在网上看到一篇关于System.Runtime.Remoting.Messaging.Call
Context
这个类的详细介绍才知道,原来
Http
Context
.
Current
是基于System.Runtime.Remoting.Messaging.Call
Context
这个类,子线程和
异步
线程都无法访问到主线程在Call
Context
中保存的数据。所以在
异步
执行的过程会就会出现
Http
Co
PM > Install-Package AspNetCore
Current
Request
Context
首先,您必须在Startup类中的Configure
方法
I
Application
Builder
Current
Request
Context
Middleware添加到I
Application
Builder 。
您可以使用扩展
方法
Use
Current
Request
Context
来
实现
。
public class Startup
public void Configure ( I
Application
Builder app )
// add
Current
Req
本文参考了
http
://stephenwalther.com/blog/的内容。今天需要对ASP.NETMVC的Controller进行测试,我们都知道当我们在测试工程里new一个controller时,这个controller里的
http
context
是空的,也就是
session
,cookie,form等都是空。
方法
一:Mockcontroller的
Http
Context
,暂时失败那么我们如何对controller进行测试呢,我首先想到的是mock一个
http
context
,这里我用的是RhinoMockspublicstaticclassMvcMockHelpers { p
今天在手机App测试接口的时候发现一个通过POST方式的接口 获取body中的参数一直为空,但是在数据量小的时候却可以获取到数据,开始怀疑是不是POST的长度有限制,然后在web.config中修改了一下maxRequestLength,如下
<system.web>
<
http
Runtime targetFramework="4.5" maxRequestLen...
var mock
Context
= new Mock<Controller
Context
>();
mock
Context
.Setup(c => c.
Http
Context
.Response.Redirect("
http
://www.baidu.com"));
var controller=new HomeController();
controller.Controller
Context
= mock
Context
.Object;
controller.Relocation();
mock
Context
.Verify();
Http
Context
.
Current
.Request.InputStream 找了一下发现有 Request.Body 然后就替换了
后来又发现Request.Body 取不到数据将代码移到ActionFilter,读取到的Body数据依然为空。最后将代码移到Middleware中,读取到的Body数据还是空。
问题
解决
网上搜了一圈发现.net Core缓存
Http
请求的Body数据 只能读取一次
Application
_Start 网站启动时候触发,只执行一次
Application
_End 网站关闭时候触发,只执行一次
Session
_Start 创建
session
时候触发
Session
_End 销毁
session
时候触发
Application
_Error
IIS请求流程
Http
请求到达IIS服务器后,
Http
RunTime作为入口,
Http
RunTime类的ProcessRequest
方法
。
Http
RunTime包含着所有的
Http
请求信息(ProcessRequest
方法
的
Http
WorkRequest参数)。
IIS服务器依赖
HTTP
.SYS驱动监听
Http
请求。IIS在操作系统启动时候再
HTTP
.SYS中注册自己的虚拟路径(URL访问返回404在这一步执行确定)
URL通过验证,
HTTP
.SYS交给IIS的w3wp.exe执行。然后IIS接收返回的数据流,返还给
Http
.sys,最后由
HTTP
.SYS 返回浏览器。
Http
请求的处理过程是通过管道(托管模块Module和处理程序Handlers组成)
创建
Http
WorkRequest对象,包含所有的
HTTP
请求信息
Http
WorkRequest将请求传递给
Http
RunTime的ProcessRequest
方法
,
Http
RunTime创建
Http
Context
对象,并且用
Http
WorkRequest进行初始化。
Http
RunTime调用
Http
Application
Factory的Get
Application
Instance
方法
创建
Http
Application
(
Http
Application
继承自I
Http
Handler,应用程序对象池中是否存
在
Http
Application
,存在返回不存在New返回)