1. Context 名词解析
Context 直接翻译就是上下文。"上下文" 这个名词仍是挺让人费解的,是一个很是泛化的概念。刚看到有点让人摸不着头脑,一个高端大气上档次的名词,若是要找一个相似的解释能够是咱们读文章会用到的语境。
咱们讲个“语境” 与“上下文”的例子,可能能够帮助理解。好比“他是背着包袱离开家的,”“包袱”在这里面有点歧义。 这句话能够理解为“他背着一包东西离开了家”,也能够说“他带着思想负担离开了家”,在这里词语“包袱”只有借助特定的语境才能肯定其真正含义。 那么咱们在 web 中常常使用到的Session , 也是这样的, 单单给你一个Session,你是没有办法知道具体的含义的,每一个请求过来的 Session可能都会不同,可能有些里面就没有值,只有在运行时每一次请求上下文中咱们获取的这个Session的值才是有意义的。
2. HttpContext 的简单介绍
首先咱们来看一下这个类的定义,这里面只是截取了部分,标红的是咱们常常用到的,有些是每一次请求必需要用到的,既然我用了请求这个词,那就是对应的 HttpRquest。有请求就会有返回,这个就是HttpReponse。
咱们首先看一下 命名空间 System.Web,这个只要稍微知道一下,有时咱们要用一个 api 常常不知道它所在的命名空间。
HttpRequest 的定义
这个是与请求有关的全部参数,看这个主要是了解 Request 的大概内容。 若是你要获取一个跟浏览器有关的信息,好比cookie 的值,那你应该从这个地方来找一下有没有,若是连这个地方都没有,那很大可能性,你是没有办法获得的。固然 cookie这边是有的。再看一下QuertString上面 有具体的使用方法,这些方法不是我本身写上去的,是api里面自带的,告诉你怎么使用的,这些关注一下,能够加深你对一个api的记忆。 当你不知道一个api怎么用的时候,先去定义里面看一下关于这个api的各类信息,里面总归有一个是适合你的,若是实在找不到,能够考虑一下你要找的信息是否是在其余api里面,与HttpRequest 有关吗,好比你要指定返回信息的字符集,那应该到 HttpReponse 里面去找,咱们不能用一个化学方程式来解决一个牛顿力学问题,不过好像如今大部分汽车的能量来源是化石燃料,化学方程式可能也能够处理物理问题。
HttpReponse 的定义
这个是与返回有关的全部参数,若是你要指定返回的字符集,那你能够指定 Charset。
咱们发现HttpReponse里面也有一个 Cookies,那么这个 Cookies 和 HttpRequest 是同一个吗?若是你有答案了能够验证一下。
var requestCookie = HttpContext.Current.Request.Cookies;
var reponseCookie = HttpContext.Current.Response.Cookies;
var b = requestCookie.Equals(reponseCookie);
3 . HttpContext 总结
经过上面的两个例子,给咱们的感受 Context 有点像一个仓库,咱们须要什么就能够去里面拿,若是在这里面也找不到.,那其余地方就很难再找到了。下面咱们从新认识一下HttpContext。
HttpContext 就是关于 Http请求过程当中涉及到的全部变量或者引用存放的一个仓库。 相似的咱们还有 DbContext, ApplicationContext 。在这里面咱们提到了 “上下文”、“仓库” 这些名词,在这篇文章的边界以内,指代的就是 Context 这个概念。
4. 小思考
既然咱们知道了这些,那就给你出个小题目呗,若是要获取用户的 IP 那应该从哪里去找,可能有时候获取的值跟你想象的不同,应用服务器前面有了一层反向代理服务器好比 Nginx , 会不会影响咱们这种方式取IP地址呢,这时咱们该怎么办。
这里面涉及到一个小定义
X-Forwarded-For:简称XFF头,它表明客户端,也就是HTTP的请求端真实的IP,只有在经过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中能够找到该项的详细介绍。标准格式以下:X-Forwarded-For: client1, proxy1, proxy2
var headers = HttpContext.Current.Request.Headers;
var forward = headers["X-Forwarded-For"];
forward 记录完整的代理链路。