Asp.Net六大内置对象
前面学习mvc管道处理模型的时候,我们晓的HttpContext是贯穿全文的一个对象,在HttpRuntime产生,现在我们所谓的Asp.Net六大内置对象,其实就是HttpContext的属性。具体为:
一:Request即是Http请求提供的各种信息
A:Request的Heads里面的信息,通过代码:
public ActionResult Request()
{
List<string> requestHeads = new List<string>();
foreach (var item in base.Request.Headers.AllKeys)
{
requestHeads.Add($"{item}:{base.Request.Headers[item]}");
}
ViewData["requestHead"] = requestHeads;
return View();
}
views:
@{
Layout = null;
}
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Request</title>
</head>
<body>
<div>
RequestHeads:<br />
@{
foreach (var item in (List<string>)ViewData["requestHead"])
{
<label>@item</label><br />
}
}
<div>
</div>
</div>
</body>
</html>
得到的页面结果如下,即是RequestHeads里面的信息都可以完整的获取到,后台代码可以通过:context.Request.Headers["键名"],其中还可以包含自定义的key,如BasicAuth; 其实请求信息的解读是asp.net_isapi按照http协议解析出来的。
B:除此之外,还可以获取到URL,Form,Params等很多信息,只要是HTTP请求过来的基本都能拿到,具体可以参考HttpRequestBase类的属性url参数 form参数 url地址 urlreferer content-encoding,就是http请求提供的各种信息,后台里面都是可以拿到的context.Request.Headers["User-Agent"];包括自定义的--BasicAuth; 请求信息的解读是asp.net_isapi按照http协议解析出来的
二:Response即是响应
mvc呈现最终都是使用Response.Write方式的输出,总结下来 各种result扩展就是序列化然后通过response输出,给客户端响应内容,响应的内容除了body(json/html/file),其实还有很多东西,各种header等,然后把这些东西响应出去交给浏览器去用。之前我们有做过的压缩,缓存,cookie等都是在Response中写入的。然后浏览器会根据这些设置去做相应的设置。具体怎么设置Response响应的东西,我们来拿压缩跟缓存来举一个例子。代码如下:
压缩:
/// <summary>
/// 浏览器请求时---声明支持的格式---默认IIS是没有压缩
/// ---检测了支持的格式---响应时将数据压缩(IIS服务器)---响应头里加上Content-Encoding
/// ---浏览器先查看数据格式---按照压缩格式解压--(无论你是什么东西,都可以压缩解压)
///
/// 压缩是IIS 解压是浏览器
/// 就像lucene分词,重复的单元可以节约空间
/// </summary>
public class CompressActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var respose = filterContext.HttpContext.Response;
string acceptEncoding = request.Headers["Accept-Encoding"];//检测支持格式
if (!string.IsNullOrWhiteSpace(acceptEncoding) && acceptEncoding.ToUpper().Contains("GZIP"))
{
respose.AddHeader("Content-Encoding", "gzip");//响应头指定类型
respose.Filter = new GZipStream(respose.Filter, CompressionMode.Compress);//压缩类型指定
}
}
}
缓存:
public class CacheFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 缓存时长 单位s
/// </summary>
private int _MaxSecond = ;
public CacheFilterAttribute(int duration)
{
this._MaxSecond = duration;
}
public CacheFilterAttribute()
{
this._MaxSecond = ;
}
/// <summary>
/// action执行后
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (this._MaxSecond <= ) return; HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(this._MaxSecond); cache.SetCacheability(HttpCacheability.Public);
//cache.SetLastModified(DateTime.Now.AddHours(8).Add(cacheDuration));
//cache.SetExpires(DateTime.Now.AddHours(8).Add(cacheDuration));//GMT时间 格林威治时间
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
}
}
即是浏览器Response中得到的都可以进行设置操作:
三:Application即是全局的东西,多个用户共享
我们晓得部署到IIS上面的项目是多并发的,即每个用户访问都有各自域,这些都是不共享的,各自在各自的域中运行解析,但是Application是提供了一个全局变量,即不会分域,每个访问者都是使用的同一个Application。因为牵涉到是全局的,所以这个变量很少被使用到。但是可以通过这个变量来统计一下访问量。但是每次使用时需要加锁解锁,不然高并发会有所影响。下面也介绍一下介个变量的一些使用方法:
#region Application
context.Application.Lock();//ASP.NET 应用程序内的多个会话和请求之间共享信息
context.Application.Lock();
context.Application.Add("try", "die");
context.Application.UnLock();
object aValue = context.Application.Get("try");
aValue = context.Application["try"];
context.Application.Remove("命名对象");
context.Application.RemoveAt();
context.Application.RemoveAll();
context.Application.Clear(); context.Items[""] = "";//单一会话,不同环境都可以用,比如在httpmodule获取到的信息,想传递给action;随着context释放
#endregion
四:Server也就是个帮助类库,具体详情参考HttpServerUtilityBase,下面仅仅列取一些常用的方法:
#region Server
//辅助类 Server
string encode = context.Server.HtmlEncode("<我爱我家>"); //HtmlEnode编码
string decode = context.Server.HtmlDecode(encode);//HtmlEnode解码 string physicalPath = context.Server.MapPath("/Home/Index");//只能做物理文件的映射
string encodeUrl = context.Server.UrlEncode("<我爱我家>"); //URLencode编码
string decodeUrl = context.Server.UrlDecode(encodeUrl); //URLencode解码
#endregion
五: Session即是用户第一次产生,一个用户一个Session;是字典式存储的;session保存的是sessionid和value,value是个集合,集合有个currentUser的key,即是一次SessionId可以对应多个key,一个key对应一个Value的值。
1:Session的一般用法:A:用户登录验证,登录时写入,验证时获取; B:验证码;C:跳转当前页;
2:Session的代码操作如下:
#region Session 的存储,可以存储各种各样的值,然后以键值对的形式存储
var currentUser = new CurrentUser()
{
Id = ,
Name = "wss",
Remark = "test by wss "
};
var context = base.HttpContext;
var sessionUser = context.Session["CurrentUser"];
context.Session["CurrentUser"] = currentUser;
context.Session["CurrentUser1"] = "wss";
context.Session["CurrentUser2"] = ;
context.Session["CurrentUser3"] = DateTime.Now;
context.Session.Timeout = ;//minute session过期等于Abandon,过期日期是滑动时间,即是每次访问都会在当前访问的时间上面增加3分钟
#endregion #region Session的取值,直接使用键即可,取出来的是object类型
var CurrentUser = context.Session["CurrentUser"];
var CurrentUser1 = context.Session["CurrentUser1"];
var CurrentUser2 = context.Session["CurrentUser2"];
var CurrentUser3 = context.Session["CurrentUser3"];
#endregion #region Session的清除方式
context.Session["CurrentUser"] = null;//表示将指定的键的值清空,并释放掉,但是session的key还是存在的
context.Session.Remove("CurrentUser"); //将session中的key跟value移除掉
context.Session.Clear();//表示将会话中所有的session的键值都清空,但是session还是依然存在,
context.Session.RemoveAll();//表示将会话中所有的session的键值都清空
context.Session.Abandon();//就是把当前Session对象删除了,下一次就是新的Session了 ,介个使用同一个浏览器测试没有出现想要的效果
#endregion:
3:Session的特点:
A:是服务器内存(sessionstateserver/SQLServer),所以体积不要太大,可以存敏感信息,但是重启丢失。
B:因为一个用户针对于一条session,而且session是存储在内存中,那如果负载均衡下面的session如果共享呢,可以通过会话粘滞/session存储在固定的服务中来解决介个问题
C:mvc中的Tempdate是使用Session来传值的。
六:Cookie是存储在客户端(浏览器)上面的一连串字符串,一个用户一个Cookie,字典式存储;
1:Cookie的使用方向:A:用户登录验证,登录时写入,验证时获取;B: ValidateAntiForgeryToken;C:保存用户数据(记住账号;购物车;访问过那几个页面;);
2:cookie的代码使用:
var context = base.HttpContext;
var currentUser = new CurrentUser()
{
Id = ,
Name = "wss",
Remark = "test by wss Cookie"
};
#region cookie的存储 HttpCookie myCookie = new HttpCookie("CurrentUser");
myCookie.Value = JsonHelper.ObjectToString<CurrentUser>(currentUser); //只能是字符串
myCookie.Expires = DateTime.Now.AddMinutes();//如果设置Expires,则会保存到硬盘,不设置就是内存cookie--关闭浏览器就丢失
context.Response.Cookies.Add(myCookie);//一定要输出 #endregion #region cookie的取值
HttpCookie myCookie1 = context.Request.Cookies["CurrentUser"];
#endregion #region cookie的清除,注意cookie没有移除等方法,只能设置过期时间
if (myCookie1 != null)
{
myCookie1.Expires = DateTime.Now.AddMinutes(-);//设置过过期
context.Response.Cookies.Add(myCookie1);
}
#endregion
3:cookie的特点:
- A:因为cookie是存在客户端,所以不能有敏感信息,而且cookie推荐加密
- B:因为每次请求都提交,这个是浏览器的特性,所以cookie不能太大,否则会影响性能
- C:可以不指定expiretime,这样就可以存浏览器内存,然后关闭浏览器就cookie就丢失了
- E:如果想存在硬盘就指定expiretime,如存在硬盘,以后想清空就修改有效期,否则不会丢失
- F:cookie是跟浏览器有关系的,同一个浏览器登陆能覆盖,因为一个浏览器cookie只有一个地方存储,不同的浏览器登陆就不会覆盖,另外无痕模式是不会覆盖的
- G:cookie是不跨域的
七:http协议:超文本传输协议,也就是个文本传输的规范;浏览器/客户端遵循;服务端也遵循,那么就可以发起交互了,具体就是靠文本来传输的,其实文本就是按照规范来拼接好的一连串字符串。具体请求如下图
跨域:浏览器A域名去访问B域名的东西,但是浏览器限制了跨域的请求,如果想要解决,就是服务响应的时候,增加响应头original-
八:Cookie跟Session的关系
是因为Http协议是无状态的,因此但是后面又想客户端跟服务器端进行交互,所以就产生的cookie跟session,具体他们之间交互的过程请看下图:
所以第一次客户访问会产生一个sessionid,然后写在cookie中,等下次客户再访问时,会把cookie中的sessionid带上,这样就晓得该客户的一些行为。
注意:sessionid会存在cookie中,那如果客户端把cookie禁用掉,那session还生效吗?答案是否定的,如果想要生效,必须通过URL或者隐藏文本框等其它渠道来解决。
Asp.Net六大内置对象的更多相关文章
- ASP.NET的六大内置对象
ASP.NET 六大内置对象(System.Web.UI.Page类): 1.Response 2.Request 3.Server 4.Application 5.Session 6.Cooki R ...
- ASP.NET常用内置对象
ASP.NET 常用内置对象:Response对象.Request对象.Session对象.Server对象.Application对象 1.Response对象: (1) 用于向浏览器输出信息 常用 ...
- ASP.NET 的内置对象
ASP.NET的内置对象介绍 1.Response 2.Request 3.Server 4.Application 5.Session 6.Cookie Request对象主要是让服务器取得客户端浏 ...
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
C#构造方法(函数) 一.概括 1.通常创建一个对象的方法如图: 通过 Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...
- 2017-5-22 ASP六大 内置对象
ASP内置对象:提供内建对象,这些对象使用户更容易收集通过浏览器请 求发送的信息.响应浏览器以及存储用户信息(如用户首选项). 1.Request --- 获取请求对象 获取通过地址栏传值过来的对象 ...
- ASP.NET 常用内置对象详解-----Response
利用提供的内置对象,可以实现页面之间的数据传递及实现一些特定的功能,如:缓冲输出,页面重定向等等. Response :响应,反应 Request:请求 Server:服务器 Application: ...
- ASP.NET常见内置对象(一)
在web开发中,数据库都是通过HTTP协议来传输的.但HTTP是一个无状态协议,不会保留数据的状态和信息. 为了解决问题.各种开发语言都提供了状态管理功能. 状态管理是在同一页或不同页的多个请求发生时 ...
- Asp.net的内置对象!!!
还记得自己第一次面试的时候,面试官问的问题就是.net内置对象的问题,当时就让尴尬的要死... 所以作为新手的我们还是要知道这些轮廓的东西的! 1.Response对象 2.Request对象 3.A ...
- JSP三大指令 六大内置对象
(1)include指令 作用: 在当前页面用于包含其他页面 语法: <%@include file=”common/header.jsp”%> (2)page指令 作用: 告诉tomca ...
随机推荐
- Maven配置以及环境搭配
1. Maven简单介绍 Apache Maven是个项目管理和自动构建工具,基于项目对象模型(POM)的概念. 作用:完成项目的相关操作,如:编译,构建,单元测试,安装,网站生成和基于Maven部署 ...
- 【hdu3311】Dig The Wells(斯坦纳树+dp)
传送门 题意: 给出\(n\)个重要点,还有其余\(m\)个点,\(p\)条边. 现在要在这\(n+m\)个点中挖几口水井,每个地方的费用为\(w_i\).连接边也有费用. 问使得这\(n\)个地点都 ...
- 1、zabbix监控基础概念
目录 为什么要使用监控? 监控怎么用? 去到一家新公司,应该如何搭建监控系统? 我叫张贺,贪财好色.一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛 ...
- Log日志级别从高到低排序 ERROR、WARN、INFO、DEBUG
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR.WARN.INFO.DEBUG.通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关.比如在这里定义了INFO级别,则应 ...
- 《Verilog数字系统设计教程(第2版).pdf》
Verilog数字系统设计教程(第2版).pdf https://github.com/shigh1005/pdf_book <Linux设备驱动开发详解:基于最新的Linux 4.0内核.pd ...
- 【电脑】win10开启telnet服务
- Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索
https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...
- [学习笔记] 舞蹈链(DLX)入门
"在一个全集\(X\)中若干子集的集合为\(S\),精确覆盖(\(\boldsymbol{Exact~Cover}\))是指,\(S\)的子集\(S*\),满足\(X\)中的每一个元素在\( ...
- docker 部署 HFish(集群部署)
主节点部署: docker run -d --name hfish-master -p : -p : -p : -p : -p : -p : -p : -p : -p : -p : -p : -p : ...
- uni-app 环境配置,uni.request封装,接口配置,全局配置,接口调用的封装
1.环境配置 (可参考uni-官网的环境配置) common文件夹下新建config.js let url_config = "" if(process.env.NODE_ENV ...