zoukankan      html  css  js  c++  java
  • ASP.NET

    1 VS新建--其他类型项目--空白解决方案,可以在该空白解决方案下面建立很多应用程序及网站。

    2. IIS会根据请求的文件类型进行判断,如果发现浏览器请求的是动态文件(ashx ,aspx)IIS是处理不了的,这时IIS会将请求交给.netframework来处理。比如aspnet_isapi.dll处理ashx的请求。具体映射关系可以查看IIS--功能视图-处理映射表。所以要先安装iis(控制面板-程序和功能-打开或关闭windows功能),后安装.netframework(vs安装时会自动安装framework),否则此映射关系表就不存在,iis会出现问题。此时必须运行一个脚本命令来注册映射才可以。

     3. Requset.MapPath()将文件的虚拟路径转换为物理路径,注意,在asp.net中对文件或文件夹的操作必须获取物理路径

    4.Web网站与Web应用程序区别:主要因为两者的编译方式不同造成的。

    asp.net应用程序是有命名空间的,web网站没有命名空间

    为什么web网站没有命名空间,因为网站里的文件是独立的一个文件,不会与其他文件发生冲突。

    asp.net应用程序里只要有一个程序有语法错误,整个应用程序都无法访问,web网站里每个页面都是独立的,一个文件出问题不会影响其他的文件正常访问,

    因为asp.net应用程序每次都要重新生成。会检查所有文件的语法错误。而网站是请求哪个页面,对哪个页面进行编译,其他的页面不编译,所以不会影响其他程序。

    所以改动asp.net应用程序里的文件代码,必须重新生成,而网站不用重新生成,改完代码保存后即可访问。

    网站中的每个页面都会生成程序集dll,名字是随机的。而web应用程序中所有文件编译成一个程序集dll,所以web应用程序里的每次代码修改,都必须重新生成,生成新的dll。

    web网站中加入的类文件如SqlHelper等,必须放到App_Code文件夹里,否则报错,因为如果其他页面使用到SqlHelper,而web网站中的每个页面单独编译成一个程序集,如果不放到App_Code文件夹中,SqlHelper文件根本就编译不到程序集中,因此会报错。web网站中的App_Code文件夹里的所有的类文会单独编译成一个dll,bin文件夹下会有一个App_Code.dll。所以web网站中加入的其他类文件,必须放到App_Code文件夹里。

    而web应用程序中则可以不用放到App_Code文件夹中。因为所有的文件会统一编译成一个程序集dll,所以是可以找到SqlHelper类的。

    web网站是运行的时候才编译,每个文件编译成一个dll,App_Code文件夹单独编译成一个dll

    web应用程序是整个应用程序编译成一个dll,而且必须之前编译好。

    综上:开发中使用web应用程序,因为web网站中如果有页面错误,不易发现。

    5.aspx,aspx.cs最终都会各自生成一个类,aspx生成的类是aspx.cs生成类的子类,可以从aspx页面第一行的page指令有个Inherits可以看出。所以aspx页面可以获取aspx.cs中非私有的属性值。

    6.IsPostBack   Page封装的属性,用于判断是否是第一次访问页面

    对于一个含有表单的页面,表单的默认提交方法是post,而点击超链接访问该页面时,是get请求,因此需要区分出是点击超链接访问本页面,还是点击submit  post方式提交数据访问本页面。因此需要在Page_Load方法内区分出两种请求方式。点击超链接get请求时,IsPostBack为false,表单提交post请求时IsPostBack为true。

    IsPostBack  是根据隐藏域的值进行判断的,如果是post请求,隐藏域的值会提交到服务端,IsPostBack为true。

    如果将form标签内的runat="server"去掉,就不能用 IsPostBack来判断是Get请求还是POST请求,因为去掉runat="server就不能再产生隐藏域__VIEWSTATE了

    ========================================美丽的分割线===============================

    1.如果访问的是静态html页面,iis直接读取页面返回给浏览器,如果访问的是aspx动态页面,iis发现处理不了,就交给framework处理,为什么iis处理不了aspx动态页面,因为iis出现比asp.net要早。

    2.一般处理程序ashx中没有IsPostBack属性,那在一个页面ProcessRequss方法中如何区分get,post提交呢?

      由于http协议的无状态行,不可以在ProcessRequest方法中定义bool变量来模拟IsPostBack实现。

      因为get访问是不带任何数据来,而post提交是点击按钮提交数据的访问,所以可以通过判断是否有带数据过来进行区分。所以可以在表单中增加一个隐藏域来实现。

      <input type="hidden" name="ispostback" value="1" />

      如果是get请求,隐藏域的值是不会提交给服务器的。

    3. Response.End()立即输出缓存中的内容,其后面的代码不在运行了。

    4.bin目录下的*.pdb文件是什么意思,pdb是调试数据库,调试的时候,相关的数据存在里面。

    5.Response.Write("<script>alert('删除成功');window.location='a.ashx'</script>");避免看不到删除成功的提示消息。alert是会阻断当前线程的。

       一般不弹窗提示,可以输出文字 到页面,倒计时几秒再跳转。

    6.前台页面继续后台页面,所有的页面都实现了IHttPHandler接口,在ProcessRequest方法中生成Page_Load方法。

      前台有runat="server"的控件,在后台页面会建立一个变量与之对应,所以可以在后台 . 出前台runat="server"的控件。

        后台.cs文件先于前台文件执行。Page_Load方法执行完后再执行前台文件。

     aspx是一种特殊的ashx。

    Request.UrlReferer:当用户点击页面中的超链接时,浏览器请求报文中增加了一个Referer属性,表面是从哪个页面链接到本页面的,在ASP.NET中可以通过Request.UrlReferer来获取该值。

    Request.UserHostAddress,获取访问者的ip地址

    Request.MapPath(virtulpath)将虚拟路径转换为磁盘上的物理路径

    响应的缓存输出,asp.net向浏览器write数据的时候,并不会每次write数据就立即将数据输出给浏览器,而是会缓存数据,待合适时机或者响应结束的时候再输出给浏览器。

    Response.Write()数据不会立即输出,会先到一个缓冲区中。

    Response.Flush()将缓存区中的数据立即输出给浏览器

    取消缓存功能,write会每次都输出给浏览器。功能与每次write后加上Flush作用是一样的。

    Response.BufferOutput=false;

    Response.Buffer=false;

    经过reflector反编译,发现上面两个是一样的,Buffer内部就是调用的BufferOutput

    Response.Clear()清空缓冲区中的数据,没有发送到浏览器的数据将被清空,不会再发给浏览器

    Response.ContentEncoding属性,输出流的编码

    Response.ContentType属性,输出流的内容类型,比如是html(text/html),还是普通文本(text/palin),还是Jpeg图片(image/Jpeg)

    Response.End()终止响应,将缓存区中的数据输出给浏览器,End()之后的代码不再被执行,End方法里调用 了Flush方法,在终止一些非法请求 时候可以使用,比如盗链。

    Server对象:HTTPServerUtility的实例,提供对服务器上的方法和属性的访问。

    MapPath方法:取得文件的物理路径

    //执行另一个页面的脚本

    Transfer方法:

    Server.Transfer("list.aspx");内部重定向,在服务器端执行另一个页面,并将执行的结果返回到浏览器,Transfer方法后的代码都不会运行。

              注意:只是把另一个页面的数据在当前页面显示,所以浏览器地址栏不变,区别开Response.Redirect()方法

    Excute方法

    //将文本编码成可以在浏览器中正确浏览的格式

    HtmlEncode方法//就是将 < 转成&lt; > 转成&gt;输出

    HtmlDecode:

    //Url编码和解码

    UrlEncode方法

    UrlDecode方法

    ===========================================================================================

    状态保持:

    由于http协议的无状态性(因为是基于Socket通信的,每次通信完毕都会关闭Socket),当从一个页面跳转到另一个页面时,必须记得一些数据,比如用户登录的信息等,所以必须将数据记录到某个地方。访问其他页面的时候,把需要的数据带上。有如下方法。

    1.客户端。Cookie

    2.服务器端。Session

    3.表单中。 加一个隐藏域

    客户端本质上有三种:隐藏域,Cookie,QueryString(url?name=aa)

    常用的状态保持方法:

    1.ViewState   aspx中特有的,ashx中没有,必须加一个隐藏域来模拟。页面级的。

      就是在页面中加一个隐藏域来保存客户端使用的数据。

    使用VIEWSTATE前提是必须有个runat=server的form表单。

         注意:服务器控件的值都会自动的保存在ViewState中

     viewstate实际上就是获取页面提交过来的隐藏域__VIEWSTATE中的值。可以通过viewstatedecode工具反编译看看其中的内容。

    webform的ispostback依赖于viewstate,所以要使用ispostback,必须有一个runat=server的form表单。

    只要浏览器提交的请求报文里包含__VIEWSTATE这个键,asp.net就会将IsPostBack设置为true,get,post都可以

    get要在传参的时候传入__VIEWSTATE,post在请求体中有__VIEWSTATE。

    一般IsPostBack用在post方式提交情况下,很少有get方式传参传入__VIEWSTATE的。

     设置cookie的Expires属性,会自动保存在硬盘中,默认是放在C盘的一个文件夹里

    如果不设置Expires属性,cookie会存在浏览器的内存中,关闭浏览器cookie就没了。

      //新建一个cookie对象,并赋值 键值对
      HttpCookie cookie = new HttpCookie("un", strName);
      if (!string.IsNullOrEmpty(Request.Form["chkIsAll"]))
      {
        //设置cookie14天后失效(此cookie在浏览器端会以文本的方式保存在浏览器所在电脑的硬盘中)
        cookie.Expires = DateTime.Now.AddDays(14);
      }
      //输出cookie对象信息到浏览器
      Response.Cookies.Add(cookie);
     如果是写入多个cookie,也是写在一个文件中,不同的cookie用*隔开

    不同的网站的cookie,写入不同的文件。

    Cookie退出:设置cookie的失效时间即可删除cookie

    比如登录退出,可以写在ashx中。因为不需要输出html代码。

    HTTPCookie cook=context.Request.Cookies["un"];

    if(cook!=null)

    {

      cook.Expires=DateTime.Now.AddDays(-1);//设置cookie的失效时间为一天前,即已经失效。

      context.Response.Cookies.Add(cook);//把cook重新发给浏览器,把没失效的cookie覆盖掉

    }

    带Path的Cookie:为指定的文件夹生成cookie

    当为设置的cookie指定path后,服务器发到浏览器的cookie中包含path信息。

    下次浏览器访问服务器的时候,浏览器就检查下访问的页面是不是path路径下面的文件,如果是,浏览器就把cookie带过来,否则就不带cookie

    也即:当设了path后,只有访问该path路径下的页面时候,浏览器才会带cookie过来。不是的话,就不带cookie过来。

    cook.Path="/web/admin/"   只有访问admin文件夹下的页面时候,才会带cookie过来,否则不带。

    另外还有个Cookie.Domain 域名即二级域名的cookie共享问题。

    cookie的Expires 是不可读的,只能设置,为什么不可读呢,因为浏览器根本就没有把Expires的值发到服务器。只发键和值,不带失效时间数据到服务器。

    注意:aspx的form表单中,runat="server"不能与action同时存在,否则会报视图状态MAC错误,即VIEWSTATE验证出问题。

    runat="server"的表单,只能提交到本页面的cs,不能提交到其他页面。因为每个页面的viewstate的值是不一样的,framework会做校验,提交到另一个页面,两个页面的viewstate值不一样,另一个页面不会认识本页面的viewstate,就会出现验证视图状态(viewstate) MAC失败的错误。

    Session:

    创建的Session会存在服务器端的Session池中,并可以从该session池中获得访问该对象的id号,即SessionId,服务器会以cookie的方式发给浏览器。保存在浏览器的缓存中。

     可以从响应头中包含了Set-Cookies:SessionId=。。。。看出

    所以session是基于cookie的

     当会话结束或者过期时,服务器会清楚Session对象。

     如果浏览器禁用了cookie,那Session传递机制是什么?

    如果浏览器禁用了cookie,那服务器可以将sessionid保存在URL中来完成在浏览器与服务器间的数据传递,此时需要设置配置文件里的SessionState节点

    <sessionState  cookieless="AutoDetect"></sessionState>

    IRequeriesSessionState  标记接口,内无任何方法。

    在一般处理程序ashx中,不能直接使用session,如果要使用session的话,页面类必须实现该接口,因为ashx出现比session还要早。

    aspx中的page类中已经实现了该接口。

    Session.Abandon();销毁session对象

    Session.Clear();情况服务器端的session键值对,session对象在服务端还存在。

    Session属性:

    SessionId:唯一用户会话标识符。

      如果客户端禁用了cookie,可以在代码中获取该id,通过url传参来解决。url?SessionId=id

    TimeOut:用户超时(单位:分钟),默认是20分钟

    Count:会话状态集合中的项目数

    Application对象:是HTTPApplicationState的实例

    用于保存网站共享数据。

    Application是服务器端一个共享的对象,所有页面都可以访问,所以如果同时有多个用户访问,会出现并发问题,所以要加锁。操作完成后解锁。

    Application.Lock();

    Application["aaa"]="bbb";

    Application.UnLock();

    ===================================================================================================

    1. 服务器端控件Button,LinkButton,ImageButton等可以多个控件在后台使用一个Button_Click事件来处理,每个Button 都有CommandName及CommandArgument

    属性,可以在Button_Click事件里通过这两个属性的其中一个来区分是哪个按钮点击。

    2.三种控件

        a. Html控件:就是html标签,对于服务器来说,就是一个字符串

        b. Html控件+runat="server":服务器会在后台产生一个变量与对应

        c. 服务器控件:服务器会在后台产生一个变量与对应

    3.前端绑定单引号,双引号区别。

    <asp:TextBox runat="server" Text='<%#Eval("Name") %>' />  
    注意不要写成Text="<%#Eval('Name') %>" 因为<%%>中的是C#代码,单引号''是字符,而不是字符串

  • 相关阅读:
    HackerRank
    HackerRank
    HackerRank
    LeetCode "Bitwise AND of Numbers Range"
    HackerRank
    HackerRank
    LeetCode "Binary Tree Right Side View"
    HihoCoder
    HihoCoder
    HackerRank
  • 原文地址:https://www.cnblogs.com/lxboy2009/p/5793952.html
Copyright © 2011-2022 走看看