• Asp.Net六大内置对象


    前面学习mvc管道处理模型的时候,我们晓的HttpContext是贯穿全文的一个对象,在HttpRuntime产生,现在我们所谓的Asp.Net六大内置对象,其实就是HttpContext的属性。具体为:

    一:Request即是Http请求提供的各种信息

    A:Request的Heads里面的信息,通过代码:

     1 public ActionResult Request()
     2 {
     3     List<string> requestHeads = new List<string>();
     4     foreach (var item in base.Request.Headers.AllKeys)
     5     {
     6         requestHeads.Add($"{item}:{base.Request.Headers[item]}");
     7     }
     8     ViewData["requestHead"] = requestHeads;
     9     return View();
    10 }

    views:

     1 @{
     2     Layout = null;
     3 }
     4 <html>
     5 <head>
     6     <meta name="viewport" content="width=device-width" />
     7     <title>Request</title>
     8 </head>
     9 <body>
    10     <div> 
    11         RequestHeads:<br />
    12         @{ 
    13             foreach (var item in (List<string>)ViewData["requestHead"])
    14             {
    15                 <label>@item</label><br />
    16             } 
    17         }
    18         <div>
    19         </div>
    20     </div>
    21 </body>
    22 </html>
    View Code

    得到的页面结果如下,即是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响应的东西,我们来拿压缩跟缓存来举一个例子。代码如下:

    压缩:

     1  /// <summary>
     2  /// 浏览器请求时---声明支持的格式---默认IIS是没有压缩
     3  /// ---检测了支持的格式---响应时将数据压缩(IIS服务器)---响应头里加上Content-Encoding
     4  /// ---浏览器先查看数据格式---按照压缩格式解压--(无论你是什么东西,都可以压缩解压)
     5  /// 
     6  /// 压缩是IIS  解压是浏览器
     7  /// 就像lucene分词,重复的单元可以节约空间
     8  /// </summary>
     9  public class CompressActionFilterAttribute : ActionFilterAttribute
    10  {
    11      public override void OnActionExecuting(ActionExecutingContext filterContext)
    12      {
    13          var request = filterContext.HttpContext.Request;
    14          var respose = filterContext.HttpContext.Response;
    15          string acceptEncoding = request.Headers["Accept-Encoding"];//检测支持格式
    16          if (!string.IsNullOrWhiteSpace(acceptEncoding) && acceptEncoding.ToUpper().Contains("GZIP"))
    17          {
    18              respose.AddHeader("Content-Encoding", "gzip");//响应头指定类型
    19              respose.Filter = new GZipStream(respose.Filter, CompressionMode.Compress);//压缩类型指定
    20          }
    21      }
    22  }
    View Code

    缓存:

     1 public class CacheFilterAttribute : ActionFilterAttribute
     2     {
     3         /// <summary>
     4         /// 缓存时长 单位s
     5         /// </summary>
     6         private int _MaxSecond = 0;
     7         public CacheFilterAttribute(int duration)
     8         {
     9             this._MaxSecond = duration;
    10         }
    11         public CacheFilterAttribute()
    12         {
    13            this._MaxSecond = 60;
    14         }
    15         /// <summary>
    16         /// action执行后
    17         /// </summary>
    18         /// <param name="filterContext"></param>
    19         public override void OnActionExecuted(ActionExecutedContext filterContext)
    20         {
    21             if (this._MaxSecond <= 0) return;
    22 
    23             HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
    24             TimeSpan cacheDuration = TimeSpan.FromSeconds(this._MaxSecond);
    25 
    26             cache.SetCacheability(HttpCacheability.Public);
    27             //cache.SetLastModified(DateTime.Now.AddHours(8).Add(cacheDuration));
    28             //cache.SetExpires(DateTime.Now.AddHours(8).Add(cacheDuration));//GMT时间 格林威治时间 
    29             cache.SetExpires(DateTime.Now.Add(cacheDuration));
    30             cache.SetMaxAge(cacheDuration);
    31             cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
    32         }
    33     }
    View Code

    即是浏览器Response中得到的都可以进行设置操作:

    三:Application即是全局的东西,多个用户共享

    我们晓得部署到IIS上面的项目是多并发的,即每个用户访问都有各自域,这些都是不共享的,各自在各自的域中运行解析,但是Application是提供了一个全局变量,即不会分域,每个访问者都是使用的同一个Application。因为牵涉到是全局的,所以这个变量很少被使用到。但是可以通过这个变量来统计一下访问量。但是每次使用时需要加锁解锁,不然高并发会有所影响。下面也介绍一下介个变量的一些使用方法:

     1 #region Application
     2 context.Application.Lock();//ASP.NET 应用程序内的多个会话和请求之间共享信息
     3 context.Application.Lock();
     4 context.Application.Add("try", "die");
     5 context.Application.UnLock();
     6 object aValue = context.Application.Get("try");
     7 aValue = context.Application["try"];
     8 context.Application.Remove("命名对象");
     9 context.Application.RemoveAt(0);
    10 context.Application.RemoveAll();
    11 context.Application.Clear();
    12 
    13 context.Items["123"] = "123";//单一会话,不同环境都可以用,比如在httpmodule获取到的信息,想传递给action;随着context释放
    14 #endregion
    View Code

    四:Server也就是个帮助类库,具体详情参考HttpServerUtilityBase,下面仅仅列取一些常用的方法:

    1 #region Server
    2 //辅助类 Server
    3 string encode = context.Server.HtmlEncode("<我爱我家>"); //HtmlEnode编码
    4 string decode = context.Server.HtmlDecode(encode);//HtmlEnode解码
    5 
    6 string physicalPath = context.Server.MapPath("/Home/Index");//只能做物理文件的映射
    7 string encodeUrl = context.Server.UrlEncode("<我爱我家>"); //URLencode编码
    8 string decodeUrl = context.Server.UrlDecode(encodeUrl);  //URLencode解码
    9 #endregion

    五: Session即是用户第一次产生,一个用户一个Session;是字典式存储的;session保存的是sessionid和value,value是个集合,集合有个currentUser的key,即是一次SessionId可以对应多个key,一个key对应一个Value的值。

    1:Session的一般用法:A:用户登录验证,登录时写入,验证时获取; B:验证码;C:跳转当前页;

    2:Session的代码操作如下:

     1  #region Session 的存储,可以存储各种各样的值,然后以键值对的形式存储
     2  var currentUser = new CurrentUser()
     3  {
     4      Id = 1,
     5      Name = "wss",
     6      Remark = "test by wss "
     7  };
     8  var context = base.HttpContext;
     9  var sessionUser = context.Session["CurrentUser"];
    10  context.Session["CurrentUser"] = currentUser;
    11  context.Session["CurrentUser1"] = "wss";
    12  context.Session["CurrentUser2"] = 111;
    13  context.Session["CurrentUser3"] = DateTime.Now;
    14  context.Session.Timeout = 3;//minute  session过期等于Abandon,过期日期是滑动时间,即是每次访问都会在当前访问的时间上面增加3分钟
    15  #endregion
    16 
    17  #region Session的取值,直接使用键即可,取出来的是object类型
    18  var CurrentUser = context.Session["CurrentUser"];
    19  var CurrentUser1 = context.Session["CurrentUser1"];
    20  var CurrentUser2 = context.Session["CurrentUser2"];
    21  var CurrentUser3 = context.Session["CurrentUser3"];
    22  #endregion
    23 
    24  #region Session的清除方式
    25  context.Session["CurrentUser"] = null;//表示将指定的键的值清空,并释放掉,但是session的key还是存在的
    26  context.Session.Remove("CurrentUser"); //将session中的key跟value移除掉
    27  context.Session.Clear();//表示将会话中所有的session的键值都清空,但是session还是依然存在,
    28  context.Session.RemoveAll();//表示将会话中所有的session的键值都清空
    29  context.Session.Abandon();//就是把当前Session对象删除了,下一次就是新的Session了 ,介个使用同一个浏览器测试没有出现想要的效果  
    30  #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的代码使用:

     1 var context = base.HttpContext;
     2 var currentUser = new CurrentUser()
     3 {
     4     Id = 1,
     5     Name = "wss",
     6     Remark = "test by wss Cookie"
     7 };
     8 #region cookie的存储
     9 
    10 HttpCookie myCookie = new HttpCookie("CurrentUser");
    11 myCookie.Value = JsonHelper.ObjectToString<CurrentUser>(currentUser); //只能是字符串
    12 myCookie.Expires = DateTime.Now.AddMinutes(5);//如果设置Expires,则会保存到硬盘,不设置就是内存cookie--关闭浏览器就丢失
    13 context.Response.Cookies.Add(myCookie);//一定要输出
    14 
    15 #endregion
    16 
    17 #region cookie的取值
    18 HttpCookie myCookie1 = context.Request.Cookies["CurrentUser"];
    19 #endregion
    20 
    21 #region cookie的清除,注意cookie没有移除等方法,只能设置过期时间
    22 if (myCookie1 != null)
    23 {
    24     myCookie1.Expires = DateTime.Now.AddMinutes(-1);//设置过过期
    25     context.Response.Cookies.Add(myCookie1);
    26 }
    27 #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或者隐藏文本框等其它渠道来解决。

  • 相关阅读:
    java高并发程序设计模式-并发级别:阻塞、无障碍、无锁、无等待【转载】
    Java创建线程的三种主要方式
    Java乐观锁实现之CAS操作
    Java解释执行和编译执行
    手把手教你使用百度大脑地址识别API
    详解百度大脑EdgeBoard出色的视频处理技术
    一步到位!!百度大脑语音合成快速搞定会员到访提醒功能
    一文带你了解百度大脑云狐语音全攻略(附代码)
    AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略!!
    快速上手百度大脑EasyDL专业版·物体检测模型(附代码)
  • 原文地址:https://www.cnblogs.com/loverwangshan/p/11228409.html
Copyright © 2020-2023  润新知