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#代码,单引号''是字符,而不是字符串

原文地址:https://www.cnblogs.com/lxboy2009/p/5793952.html