HttpContext & HttpRuntime

问题引出

HttpContext.Current.Cache .VS. HttpRuntime.Cache

  • HttpRuntime.Cache:获取当前应用程序的Cache
  • HttpContext.Current.Cache:为当前HTTP请求获取Cache对象,跨线程可用,在APM模式或创建了子线程的场景中不能用

HttpContext.Current.Cache 调用 HttpRuntime.Cache实现,两者指向同一 Cache对象:

  • HttpRuntime.Cache相当于是缓存具体实现类,非Web应用下也可以使用
  • HttpContext.Current.Cache是对缓存类的封装,局限HttpContext只能用于Web应用

在某些情况下,HttpContext还没被创建出来为null,就只能用 HttpRuntime.Cache。

  • 定时器的回调。
  • Cache的移除通知。
  • APM模式下异步完成回调。
  • 主动创建线程或者将任务交给线程池来执行

建议使用 HttpRuntime.Cache,既能减少出错,也减少一次函数调用。

eg:在获取程序站点的根目录时尽量使用 System.Web.HttpRuntime.AppDomainAppPath。

其中,关于 APM模式 参见:https://www.cnblogs.com/mcgrady/p/5660314.html

HttpContext

限制:同一Http请求

Server.Transfer .VS. Response.Redirect

Server.Transfer 请求跳转页面,归属同一个http请求,URL无变化,所有操作均在服务器完成;Response.Redirect 则是重新发起新的页面请求,需要浏览器和服务器交互。

具体参见:HttpContext 初识

HttpContext.Current 由其维护

System.Runtime.Remoting.Messaging.CallContext.HostContext as HttpContext

其中,CallContext.HostContext 表示:获取或设置与当前线程相关联的主机上下文 。

APM模式下的异步完成回调,访问HttpContext.Current方法:推荐第2种方法

  • 在类型中添加一个字段来保存HttpContext的引用(异步开始前)
  • 将HttpContext赋值给BeginXXX方法的最后一个参数(object state)

HttpRuntime

使用时建议自行封装,可参见:ASP.Net HttpRuntime.Cache 使用总结

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

原文地址:https://www.cnblogs.com/wjcx-sqh/p/11093956.html