如鹏网学习笔记(十四)ASP.NET

时间:2022-02-12 14:54:51

Asp.net笔记

一、Socket类
  进行网络编程的类,可以在两台计算机之间进行网络通讯
  过程:
    向服务器发送指令:
    GET /index.html HTTP/1.1
    Host:127.0.0.1:8080
    回车空行

二、浏览器是什么
  浏览器就是一个Socket网络客户端,帮助用户请求网站服务器上的内容并且将返回的内容渲染为图形化内容

  浏览器的过程:
    用户在浏览器输入网址,浏览器向DNS服务器发出Socket请求,
    服务器把请求的内容返回给浏览器,
    浏览器将内容进行解析并渲染绘制成页面展现,
    如果遇到img、css、js等文件就再次发送请求,服务器返回数据,
    继续进行渲染,直到最终请求完成。

三、编写网站服务器

  步骤:
    1,使用Socket启动监听

      Socket serverSocket = new Socket(SocketType.Stream,ProtocolType.Tcp);
      serverSocket.Bind(new IPEndPoint(IPAddress.Any,));
      serverSocket.Listen();

    2,调用Socket.Accept()阻塞等待用户请求,当一个用户请求过来后Accept()方法返回一个新的Socket对象
      每个Socket代表一个连接通道

    3,进行通信

四、静态网站服务器
  服务器路径和请求为固定的页面,请求的内容也是固定的

五、动态网站内容

  在请求的时候写上
    /add?i=1&j=2 对i和j进行相加运算
    ?前面为处理程序路径,?后面为请求的参数,以&分隔多个参数

六、请求处理响应

  浏览器(收集用户操作)——服务器(对用户请求进行处理)——浏览器(解析、显示)
  向服务器发送请求 想浏览器返回响应

  服务器不知道浏览器什么时候关闭,他们之间是短暂的网络连接
  除非浏览器请求,否则服务器无法主动向浏览器发送数据!!!

七、Web服务器和ASP.NET

  web应用程序:一般处理程序
  一般处理程序与html页面联系起来靠<form action="XX.ashx"></form>

  Web服务器帮助处理静态文件的请求;
  对于动态内容,web服务器帮着进行http层面的处理,具体请求由ASP.NET程序负责

八、一般处理程序
  示例代码:

    context.Response.ContentType = "text/html";
    string name = context.Request["name"];
    context.Response.Write(name+"<font color='red'>你好"</font>);

  过程:

    每当用户请求访问ashx页面的时候,ProcessRequest方法就会被调用,在这里通过访问context.Request获得访问者的请求参数。
    然后在ProcessRequset中通过context.Response向浏览器发回数据

  注意:
    建立项目的时候选择网站和webApplication的区别?

  如何避免每次都手动输入地址栏?
    在属性里设定定向网站

  调试方式和非调试方式的不同用途:
    调试可以设置断点;
    非调试方式启动(项目停止运行后还可以访问)可以修改
    cs代码重新生成就可以起作用,静态文件的修改不需要重新生成
  

九、表单的提交

  <form></form>表单元素中的有name属性的input、select、textarea等的元素的value值会自动调教给服务器
  通过设定action属性,来指定提交给哪个ashx程序

  注意:name才是提交给服务器用的,可以重复
  服务器端用context.Request["username"];来根据表单项的name来获得提交的属性值
  checkbox没选中为null,选中为“on”
  radiobutton,同name的为一组
  当input=submit的时候,只有被点击的按钮(要有name)的value才会被提交
  只有在form标签内的标签才可能被提交到服务器,之外的会被忽略!!

十、favicon.ico请求

  大部分浏览器的默认请求,如果网站服务器的目录下有这个文件,就会被拿来当做标签的小图标
  收藏夹里也支持

十一、http协议

  1,连接(Connection)
    浏览器和服务器之间传输数据的通道。
    一般请求完毕就关闭,http不保持连接。
    

    好处:可以提高并发请求的效率
    缺点:因为建立连接的速度问题,(每次请求html文本和图片是独立的两次连接)
        降低的浏览器响应的速度

  2,请求(Request)
    浏览器向服务器发送的“请求”信息,包含了请求的类型、数据和浏览器的信息(语言、浏览器版本等)

    GET /请求的地址 HTTP/1.1 表示向服务器用GET方式请求首页,使用HTTP/1.1协议
    User-Agent(简称UA)   为浏览器的版本信息。通过这个信息可以读取浏览器是IE或者什么
    Referer    当前页面的上一个页面(来源、所属页面)
    Accept-Encoding    服务器支持什么压缩算法。
    Accept-Language    浏览器支持什么语言

  3,响应(Response)
    服务器对浏览器请求的返回的数据,包含是否成功、错误码等。
    浏览器不知道服务器的处理过程,仅仅是拿到结果进行渲染输出

    响应码举例:
      “200” :   OK;

      “302” :   Found 暂时转移,用于重定向, Response.Redirect()会让浏览器再请求一次重定向的地址,
          重定向的请求是Get方式;

      "404" :   Not Found 未找到。

      500   服务器错误(一般服务器出现异常),通过报错信息找出异常的点。

      403:  客户端访问未被授权。

      304  (服务器把文件的修改日期通过Last-Modified返回给浏览器,浏览器缓存这个文件,
          下次向服务器请求这个文件的时候,通过If-Modified-Since问服务器说“我本地的文件的修改日期是。。。”,
          服务器端如果发现文件还是那个文件,则告诉浏览器(304 Not Modified)文件没修改,还用本地的吧。ctrl+f5)。

      总结:2xx:没问题;3xx代表浏览器需要干点啥;4***浏览器的问题;5xx服务器错误
  4,处理(Process)

    服务器通过Content-Type告诉客户端响应的数据的类型,方便给浏览器按照类型进行响应
    text/html HTML样式
    text/plain 纯文本样式
  

十二、Get和Post

  一个form默认有Method属性,默认的value是Get
  <form action="指向的ashx程序" method="get或者post"></form>

  get(默认值)是通过URL传递表单值,post传递的表单值是隐藏到http报文体中,url看不到
    (get会直接将提交的内容显示到地址栏,post不会)

  两者的区别:
    1,get通过url传递,在地址栏能够看到值,post是通过报文体不会显示到地址栏
    2,get传递的数据量是有限的,post没有限制
    3,get方式的结果页面可以转发给另一个浏览器直接读取,post不行(另一个角度的安全性)
  注意:
    只要在地址栏中输入一个网址回车访问,那么就是GET方式。

  数据格式:
    服务器文件名后跟着“?”,由于客户端可能向服务器端提交多个键值对,键值对之间用“&”进行分隔
    如果URL中有汉字、特殊符号等,则需要对URL进行编码

十三、HttpContext

  和本次请求相关对象的一个上下文对象,一般通过它去操作其它对象。
  如果在一般处理程序的ProcessRequest方法中,可以通过方法的context参数获得对象。
  在其他地方可以通过,HttpContext.Current拿到当前请求堆栈中的HttpContext对象
  (不建议,如果涉及到多线程,会无法获得。)

十四、HttpRequest

  请求的相关信息

  context.Request.Form["username"];获取Post请求中的值
  context.Request.QueryString["username"];获取get轻轻中的值

  context.Request["username"];  

  顺序着从QueryString、Form、Cookies、ServerVariable中找,第一个找到的就是

  地址栏中的 name=rupeng&age=8 叫做QueryString

  注意:
    请求参数返回的都是String类型数据,因为Http协议本身就是文本

十五、HttpResponse

  响应相关信息

  ContentType 设置响应的类型
  context.Response.ContentType = "text/html";

  OutputStream输出流

  context.Response.End(); 停止输出,本质是个异常,只是被freamwork给catch了

  Redirect();重定向

  向浏览器返回302重定向,是通知浏览器重新访问新网址,所以在地址栏中可以看到变化

十六、context.Server

  Server是一个HttpServerUtility类型的对象,不是一个类名

  context.server.MapPath("~/a.html");   将虚拟路径(~代表项目根目录)转换为磁盘上的绝对路径,
  (操作项目中的文件使用)

  HtmlEncode、HttpDecode
    HTML编码与解码
    

    示例代码:

    

    List<T> list = new List<T>(); 想在html中显示就要对“<>”进行转义

    &lt; less than
    &gt; great than

    context.server.htmlencode("List<T> list = new List<T>()");可以直接进行转义

    UrlEncode、UrlDecode
      url编码与解码
      方式同上!!

十七、无状态的HTTP

  HTTP协议都是无状态的:
    无法保存上次和服务器交互的内容:每次HTTP请求到达aspnet都是创建一个新的HTTPhandler对象,来进行处理

  实现“记住上次操作”的方法:

    传递给浏览器一个值,让浏览器下次提交时上传这个值,来进行判断;

  如果要知道上一次的状态:
    一个方法是在对浏览器响应结束之前将状态信息保存到页面表单中,
    下次页面再向服务器发出请求的时候带上这些状态信息,
    这样服务器就能根据这些状态信息还原上次的状态了,类似于去看病的病历本。

十八、Cookie
  Cookie是和站点相关的:
  每次想服务器请求的时候,除了发送表单参数之外,还会将和站点相关的所有Cookie都提交给服务器

  Cookie保存在浏览器端
  如果不设定Expires(Cookie 的声明周期),则关闭浏览器,Cookie就失效

  Cookie的缺点:
    不能存储太多内容——大小限制
    机密信息不能存——保存在浏览器端,容易被作假
    不希望丢失的数据不能存——可以被清除
    不能跨浏览器使用——每个浏览器的Cookie是独立的

  Cookie的Path:  将Cookie设置在哪个路径下
    如果没有设置,当前路径和子文件夹都可以读取
  
    如果要整个域名都可以访问,则要设置为“/”(根目录),
    如果没有设置,浏览器默认设置,(原理:反编译HttpCookie可以看出)

    Cookie无法跨域名读写

    子域名之间默认无法操作,需要操作则设置Domain为父域名:
      www.rupeng.com 与 bbs.rupeng.com 需要设置Domain为".rupeng.com"
      Domain=域名
十九、Session(会话)

  保存在服务器端,保存和当前客户端相关的数据
  有自动销毁机制,一段时间内浏览器没有和服务器发生交互,就会销毁(为什么一段时间没有操作,账户会推出)

  修改Session生命周期的方法:
  在web.config的System.web节点下配置sessionState节点的timeout,
  单位是分钟,默认是20(只是建议值,在设定范围内有可能会被服务器以“压力”为理由清理掉)

  Cookie和Session的区别:
    Cookie是保存在浏览器的,Session是保存在服务器的
    通过Http报文发现:Cookie中放了一个SessionId,服务器中保存SessionId和数据的对应关系
    (键值对的关系,浏览器的Cookie有记录当前的Session的Id,服务器接收到到这个Id的时候会在服务器上查找到对应的Session,并按照Session中的数据进行操作)

    两者的作用的是一样的:
      都是保存和当前客户端相关的数据,都存在生命周期

  Guid算法:
    根据网卡mac地址、系统时间、Cpu时钟周期等算出来的值,
    这个值在同一台电脑上多次调用都不会重复,不同电脑同一时间也不重复
    可以保证“全球唯一”

    调用方法:
      Guid.NewGuid();

    在服务器中生成Guid(SessionId)到Cookie中,
    然后在服务器中建立一个以Guid为文件名的文件,文件内容为session的值

二十、进程外Session
  因为Session默认是保存在服务器内存中的(InProc),当服务器重启之后,Session就会销毁,就会造成用户反复登录的问题!

  解决方法:
    将Session保存在数据库中,服务器在重浏览器拿到SessionId后去服务器查找Session的内容
    相关要点:
      需要进行“序列化”和“反序列化”
    好处:
      解决服务器重启的问题,有利于“服务器集群”技术的实现

二十一、ASP.NET WEBFORM 最佳模式

  最佳模式:
    把aspx当成模板引擎,轻量使用WebForm控件

二十二、Aspx(新建-web窗体)

  在aspx中可以使用<%=表达式%>的方式在页面的相应位置输出表达式或者局部变量
  该表达式至少要用protected级别,表达式也可以是一个方法、属性或者字段

  注意:
    如果自动提示出不来,重新生成项目即可
    不要漏写“=”,通过反编译,“=”相当于Response.Write()
    可以直接写成<%Response.Write(表达式)%>
    页面中,除了<%%>的内容和runat=server的内容,其它都是原样输出

二十三、aspx和ashx的关系

  aspx就是一个特殊的一般处理程序(ashx,IHttpHandler):
    aspx对应的类是Page,它实现了IHttpHandler接口,所以可以说aspx是高级的HttpHandler
    aspx封装了很多操作
    ashx对应handler类、aspx对应page类

二十四、aspx文件和aspx.cs文件和Designer.cs文件的关系

  aspx(web窗体)文件相当于一个html模板,在编译的时候生成和aspx.cs文件中的类的子类,会编译生成普通的.net代码,在代码中拼接生成html
  aspx.cs文件中的类和aspx.Designer.cs文件中的类都是部分类,同一个类名,
  其中Designer.cs文件中保存页面文件(aspx文件中涉及到的控件的属性,比如按钮控件的变量名等,所以必须是protected或者public级别)

二十五、runat=server的html控件
  不加就是普通的字符串,

  加上就会生成对应的控件对象

二十六、ASP.net服务端基本控件
  1,Button控件
    OnClientClick属性,点击按钮是在浏览器端执行的代码
      是字符串属性,写的代码是JavaScript代码,渲染成onclick;
      运行在浏览器端
    示例代码:
      

    <asp:button ID="btnDel" runat="server" onclientclck="return confirm('真的要删除吗?')" Text="删除" />

  2,LinkButon控件

    和Button用法一致,区别是渲染成一个超链接

  3,FileUpload控件
    会自动在form中加上 enctype="nultipart/form-data"

二十七、IsPostBack

  从客户端浏览器把之前的状态数据“提交回来”(PostBack)

  使用场景:
    if(!IsPostBack)//表示当前是第一次打开页面进行数据加载,进行数据加载
    {
      数据加载;
      //第一次打开页面的时候,进行数据加载
    }

二十八、列表控件绑定

  对象.DataSource = DataTable或者集合;//数据填充
  对象.DataBind();//数据绑定

  注意:
    DataBind前一般要判断IsPostBack

二十九、Repeater
  相当于一个高级的foreach循环,每一项的显示用ItemTemplate格式去显示

  示例代码:

    <asp:Repeater ID="Repeter1" runat="server">
      <ItemTemplate>
        <tr>
          <td><%#Eval("Name")%></td>
          <td><%#Eval("Age")%></td>
          <td><%#Eval("Gender")%></td>
        </tr>
      </ItemTemplate>
    </asp:Repeater>

  下面几个的区别是什么?
    <%=test()%>    在当前位置调用test()方法,并将返回值显示到此处。相当于:Response.Write(test())
    <%test()%>    在当前位置调用test()方法,有没有返回值显示到此处取决于方法有没有返回值
    <%#Eval("id")%>    数据绑定,取id的值,替换到当前位置

三十、ViewState
  服务器放在浏览器的“数据缓存”机制,把Http模拟成了有状态

  在aspx的html页面生成一个_viewstate隐藏字段,每次页面渲染生成html的时候,
  asp.net把viewstate中的值进行编码处理序列化为_viewstate这样一个隐藏字段放到html中
  下次再提交的时候把_viewstate提交,服务器把其反序列化填充到ViewState属性中。
  其实就是把浏览器端当成一个“数据暂存”场所。

  为什么不能把机密数据方法放在viewstate中?
    因为其实保存在浏览器端的,会被造假!!

  ViewState的坏处:
    会在html中生成一堆杂乱的代码,数据量很大的时候影响服务器性能!!

  怎么禁用ViewState?
    页面中:EnableViewState="false";此时客户端只会保留基本的_ViewState
    全站禁用:
      在Web.Config配置文件中的System.web下<pages enableViewState="false"/>
    完全禁用:
      去掉form的runat=server;
    缺点:大部分服务器控件也用不了了!
    什么时候可以适合禁用:
      当数据不需要“下次”使用的时候(不是只有设置,而是有读取控件的值的时候),就可以禁用

三十一、AJAX简介

  AJAX是一种进行页面局部异步刷新的技术。其实就是利用JavaScript创建XMLHTTPRequest对象,
    调用一般处理程序,返回处理后的数据,再用JavaScript生成html代码,就形成“局部刷新”的效果。

  用AJAX向服务器发送请求和获得服务器返回的数据并且更新到界面中,不是整个页面刷新,而是在HTML页面中使用JavaScript创建XMLHTTPRequest(简称XHR)对象,来向服务器发出请求以及获得返回的数据,

由于是在页面中由XMLHTTPRequest来发出Http请求和获得服务器的返回数据,这样页面就不会刷新了。

  XMLHTTPRequest是AJAX的核心对象。

  名词解释:
    局部:
      页面中的一小部分,不是全部一起刷新

    异步:
      网络请求期间,浏览器不卡;
      设置为异步的时候,代码会继续执行,不会停下来等返回结果,叫做“异步”

三十二、XMLHTTPRequest对象,AJAX的使用

  开发一个AJAX功能需要开发服务端(ashx程序,服务器端进行处理)和客户端(javascript进行AJAX程序)两块程序。

  AJAX请求原生DOM代码:

    //创建XMLHTTPRequest对象,三元表达式的目的是兼容旧版本的浏览器,必写
    var xmlhttp = window.XMLHTTPRequest?new XMLHTTPRequest():new ActiveXObject("Microsoft.XMLHTTP");
    //准备向服务器的一般处理程序发出Post请求,(GET方式有缓存的问题,所以第一个参数为“POST”)
    xmlhttp.open("POST","AJAXTest1.ashx?i=5&j=10",true);//true:异步模式;false:同步模式
    //监听xmlhttp的readystatechange事件
    xmlhttp.onreadystatechange=function(){
      //readyState==4,表示服务器返回完成。1代表开始,2代表
      if(xmlhttp.readyState == 4){
      //状态码200代表成功
        if(xmlhttp.status == 200){
          alert(xmlhttp.responseText);
        }
        else{
          alert("AJAX服务器返回错误!");
        }
      }
    }
    xmlhttp.send();//发送请求,发出请求后不等服务器返回数据,代码继续向下执行,所以不会发生阻塞,不会“卡”

  //简单的AJAX封装代码

    function ajax(url,onsucess,onfail){
      var xmlhttp = window.XMLHTTPRequest?new XMLHTTPRequest():new ActiveXObject("Microsoft.XMLHTTP");
      xmlhttp.open("POST",url,true);
      xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4){
          if(xmlhttp.status==200){
            onsucess(xmlhttp.responseText);
          }
          else{
            onfail(xmlhttp.status);
          }
        }
      }
      xmlhttp.send();
    }

三十三、Json

  Json就是javascript对象或者数组格式的字符串,Http协议不能传递JavaScript对象,所以需要转换为字符串进行传输,需要JSON

  Json(一个标准,规定了对象以什么样的数据格式保存为一个字符串)将复杂对象序列化为一个字符串,在浏览器端再讲字符串反序列化为JavaScript可以读取的对象。

  示例代码:

    JavaScript对象:
      var persons = {name:'rupeng',age:8};
    JavaScript数组:
      var names = ['rupeng','baidu','qq'];
    JavaScript对象数组:
      var persons = [{name:'rupeng',age:18},{name:'baidu',age:1},{name='qq',age:19}];

三十四、Json的转换

  json字符串转换为js对象:使用eval()函数,

  eval()函数不安全?

    因为是动态执行解析代码,存在风险漏洞
    var obj = eval("a("+data+")");
    示例代码:
      1,在JavaScript中的Json对象的转换过程:
       

        var persons = [{name:'rupeng',age:19},{name:'baidu',age:17},{name:'taobao',age:10}];//定义JS中的一个对象数组
        //json就是一种格式,在js中将JS中的对象按照字符串的形式进行封装
        var jsonPsersons = "[{name:'rupeng',age:19},{name:'baidu',age:17},{name:'taobao',age:10}]";
        //使用eval()函数将json字符串转换回js对象或者对象数组
        var personsOut = eval("("+persons+")");//将json字符串加上小括号,传递给eval函数,就得到了js对象
        //输出这个对象数组
        for(var i = 0;i<personsOut.length;i++){
          alert(personsOut[i].name+"="+personsOut[i].age);
        }

    2,在C#中 .NET对象序列化为Json字符串的方法:

      第一步,将,.NET对象序列化,转化为Json字符串
      第二步,将Json字符串转化为js对象,进行处理

      示例代码:
      第一步:

        string strs = {"rupeng.com","baidu.com","taobao.com"};//字符串对象
        JavaScriptSerializer jss = new JavaScriptSerializer();//创建序列化器的对象
        string json = jss.Serialize(strs);//进行序列化
        context.Response.Write(json);//将序列化后的json字符串返回给浏览器

      第二步,在html文件中,对json字符串进行解析,执行JS操作
 

     <script type="text/javascript">
        ajax("JsonTest2.ashx",
          function (data) {
            var strs = eval("("+data+")");
            for (var i = 0; i < strs.length; i++) {
              alert(strs[i]);
            }
          },
        function () { alert("错误"); })
      </script>

三十五、JQuery封装的AJAX
  示例代码:

  $.ajax({
    type:"post",url:"一般处理程序.ashx",
    success:function(data){
    alert(data);},
    error:function(){alert("错误");}
  });

  ajax方法的参数就是一个字典,
  最好设定post提交,data为提交的报文体,
  success为请求成功的处理事件,
  error为请求通讯失败的处理事件(服务器错误,404等)

三十六、JQuery AJAX Json处理

  可以使用$.parseJSON()方法,把json字符串解析为JavaScript对象,比eval()方法安全

  如果设定ajax请求的ContextType为“application/json”或者ajax请求中设定datatype:"json",
  那么success的第一个参数就是JavaScript对象,不用手动去解析了

  代码示例:

  $.ajax({
    type:"post",datatype:"json",
    data:{i1:$("#txt1").val(),i2:$("#txt2").val()},
    success:function(){},
    error:function(){alert("错误");}
  });

  ajax的业务错误处理:
    error事件时通讯错误、服务器错误等。

  表单序列化:(在form场景下,如果表单很多,可以使用序列化的方式,如果不是form方式则不需要考虑)
    如果表单元素放到了form中,并且按照http的标准(设置了name属性),
    那么使用$("#form1").serializeArray()方法,就可以得到一个键值对数组,
    把这个值赋值给$.ajax的data属性。
    实现了整个form表单的元素的序列化,ajax数据处理

  全局事件:
    1,全局Loading的显示()
      示例代码:

     $(function(){
        $("body").bind("ajaxSend",function(){
        //在Loading时候的代码,比如一个loading图片(设置是否为hidden)
        }).bind("ajaxComplete",function(){
        //隐藏loading
        });
        $.ajax({type:"post",url:"目标.ashx",
          success:function(data){
            //通讯成功时执行的代码
          },
          error:function(){
            alert("通讯出错");
          }
        });
      });

  2,ajaxError全局错误处理

    代码示例同上。

三十七、ServerPush、Global文件的作用、Url重写的好处及如何实现、ASP.NET缓存的作用、母版页是什么、SHTML是什么

  只有浏览器请求服务端,服务端才有给浏览器响应数据,不会主动向浏览器推送数据,
  好处:安全、提高服务器性能

  1,ServerPush:模拟实现,服务器向浏览器主动发送数据,
    其本质就是:
      长连接,浏览器在跟服务器连接后,获取数据后,继续发送请求,一旦有新数据就会立刻返回,貌似主动推送。
      其实就是:

      while(true)
      {
        //浏览器请求数据
      }
    借用数据库,进行数据查询,服务器程序对数据库进行不断的查询,一旦获得数据就返回给浏览器,浏览器端在获得ajax返回数据后,继续向服务器程序发出请求
  2,Global文件的作用
    项目中右键添加新建项——全局应用程序类(不能改名字)
    其中的方法是对应的各个部分启动时开始调用该方法

    重点方法:
      Application_Start、  程序启动时
      Application_BeginRequest、  开始请求时
      Application_Error。  程序出错时

  3,Url重写

    发生在服务器端的url地址重新请求过程,可以配置在Application_BeginRequest、开始请求时进行请求地址的重新定向,达到“转向”的效果
    使用场景:

      protected void Application_BeginRequest(object sender, EventArgs e)
      {
        //即使用户访问一个不存在的页面,那么Application_BeginRequest也会被调用         File.AppendAllText("d:\\1.txt", DateTime.Now + "Application_BeginRequest:"+
          Context.Request.RawUrl + "\r\n");
        //Context.RewritePath("WebExcel.html");//请求重写在服务器内部发生
        //File.AppendAllText("d:\\1.txt", DateTime.Now + "Context.Request.Path:" +
        //Context.Request.Path + "\r\n");         int? count =(int?)Application.Get("Count");
        if (count == null)
        {
          count = ;
        }
        count++;
        Application.Lock();
        Application.Set("Count", count);
        Application.UnLock();         //Url重写:UrlRewrite。ViewPerson-1.aspx
        Match match = Regex.Match(Context.Request.Path, @"^/ViewPerson\-(\d+)\.aspx$");
        if (match.Success)
        {
          string id = match.Groups[].Value;
          Context.RewritePath("/ViewPerson.aspx?id="+id);
        }
      }

  4,Application
    是应用全局对象,被全体共享,操作之前先Lock,操作完unLock
    示例代码:

      Application.Lock();//先自己锁上,开始进行操作
      Application.set("name","zhangsan");//设置值
      Application.unLock();//解锁,释放
      ////////////
      Application.Get("name");//另一个地方,可以去取值

  5,ASP.NET缓存
    作用:通过缓存,降低服务器的压力(不用每次都去执行查询,)
    缺点:
      1,因为缓存是保存在内存中的,在服务器重启后会失效,

      2,存在缓存有效期内数据发生变化,会导致数据不能及时更新。因此,设置合适的缓存时间和在什么地方使用缓存,很重要
      示例代码:

        //Cache是全局共享的,任何一个Session都可以拿到这个Cache
        DataTable dt = (DataTable)HttpRuntime.Cache["persons"];
        if (dt == null)//如果Cache中没有,再去数据库中查询
          //这样可以降低数据库服务器的压力
        {
          dt = SqlHelper.ExecuteQuery("select * from T_Persons");
          //存储缓存,30秒后过期
          HttpRuntime.Cache.Insert("persons", dt, null,
          DateTime.Now.AddSeconds(), TimeSpan.Zero);
        }         Repeater1.DataSource = dt;
        Repeater1.DataBind();

6,母版页
  aspx的模板文件,右键添加“母版页”,名字随意(文件名.master)

  网页很多地方长得一样,也有不一样的地方
  Webform的母版页(MasterPage),使用母版页的窗体。母版页太笨重。
  母版页使用ContentPlaceHolder挖坑,“使用母版页的窗体”用Content填坑

7,SHTML是什么
  ServerSideInclude(SSI),主流web服务器(iis、apache等)都支持。
  效率高,不需要经过asp.net处理,轻量级。
  

  代码示例:

    <!--#include file="head.html"-->
      222222222222222222222222222222222222
    <!--#include file="foot.html"-->

三十八、Razor模板引擎
  建立方法:
    新建一个.cshtml文件
    语法使用:
      在cshtml文件中使用@后面跟表达式,表示在这个文字输出表达式的值,
      模板中Model为服务器程序处理后传递给模板的对象。
      @{}中为C#代码,C#代码可以和html代码混排

    使用方法:
      1,新建一般处理程序,

      2,通过context.server.MapPath()方法,取得.cshtml文件的路径

      3,使用File.ReadAllText()方法,读取.cshtml文件的内容

      4,调用Razor.Parse()方法进行.cshtml文件的动态编译,//Razor.Parse(cshtml,model,"编译的程序集名字"),这样可以避免重复编译,减轻服务器负担

      5,使用context.Response.Write()方法将编译后的.cshtml文件输出
    注意:
      浏览器端是查看.ashx文件

    示例代码:

      string fullPath = context.server.MapPath("~/RazorDemo/Razor1.cshtml");
      string cshtml = File.ReadAllText(fullPath);
      string html = Razor.parse(cshtml);
      context.Response.Write(html);

三十九、Razor调用外部方法
  编写一个静态方法,方法返回RawString类型,在.cshtml文件中就可以调用方法进行原样输出
  在CSHTML中@表达式后面输出的会自动进行HttpEncodedString
  HttpEncodedString    进行Http编码后输出
  RawString   进行原样输出

四十、Razor使用常见问题
  1,“无法确定使用哪一版本的ASP.NET Web Pages”
    在web.config文件<configuration>节点下添加

    <appSettings>
      <add key="webPages:Version" value="2.0"/>
    </appSettings>

  2,model如果传递对象的时候,如果只是传递普通的匿名类对象还可以(ASP.NET MVC 中都不可以)
    

    如果传递集合就不可以,因为匿名类是internal的。最好传递命名对象。
    如果非要传递匿名对象,可以使用newton.json(json.net)最新版9,先序列化为json,再反序列化为dynamic对象
  

    注意:
      取的对象不是原始数据类型了,因此要用foreach遍历,且不能显示转换,
      cshtml使用的时候都用dynamic,cshtml页面顶部要加上@model dynamic(注意大小写)

    示例代码:

      //序列化方法:
      static dynamic ToDynamic(object obj)
      {
        string json = JsonConvert.SerializeObject(obj);
        dynamic dyObj = JsonConvert.DeserializeObject(json);
        return dyObj;
      }

  3,关于在VS2015中使用的说明
    需要适合2015版本的Razor模板引擎,会出现错误