黑马程序员ASP.NET学习

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

//ASP.NET是一种动态网页技术,在服务器端运行.Net代码,动态生成HTML。能在前台完成的任务就不要放在后台完成。

//runat="server" 表示运行在服务端,声明以后才可以在服务器代码里操作。服务器控件会翻译成普通HTML标签。

//HTTP是请求、响应的模型,服务器不会来读取浏览器的网页,得到的是客户端网页提交的数据。

//HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。

//提交到服务器的表单元素一定要设定name属性,所有表单都是提交的以name为key,以value为值的内容。

//ASP.Net内置了Session机制,不要放太多的对象到Session。Session有超时销毁的机制(服务器不知道客户端网页是否在开着,什么时候关闭,靠请求来判断客户端网页是否在开着或者关闭。)Cookie保存在客户端,Session保存在服务器端,用于存放和当前客户端相关的数据。输入一个网址后,浏览器向服务器发出请求。页面中的图片、JS、CSS等在单独的请求中。

//能在用户浏览器端完成的事情,就不要到服务器端去做。客户端是不可信的,不要把敏感数据、算法写到用户浏览器端。不要把机密信息隐藏在HTML中。客户端验证不能代替服务端验证,客户端验证是为了良好的用户体验,服务器端验证是为了防止恶意请求,是最后一次把关。不要轻信用户提交的数据,对用户提交的任何数据都要进行验证。

//HttpHandler是一个HTTP请求的真正处理中心。在HttpHandler容器中,ASP.NET Framework才调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。

//HttpModule是向实现类提供模块初始化和处置事件。负责监听HttpRequest,同时对HttpRequest增添或者过滤掉一部分内容。当一个HTTP请求到达HttpModule时,整个ASP.NET Framework还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求到达HttpHandler的必经之路,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。

HttpModule实现了IHttpModule接口,可以自定义实现该接口的类,从而取代HttpModule。

//对于没有name和value属性的标签,可以使用一个隐藏的input保存它的值。

//'~'符号是ASP.Net定义的特殊符号,表示从应用的根目录开始定义,推荐使用这种方法定位。

//'/':根目录、'./':当前目录、'../':上级目录。

//在ASP.net程序中只要将mdf文件放到项目的App_Data文件夹即可,在连接字符串中使用

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\xxx.mdf;Integrated Security=True;User Instance=True

做连接字符串即可。IIS会自动的对App_Data文件夹进行安全性的设置。

//aspx是页面模板,是页面的描述文件,是模板引擎。Html、JavaScript、CSS都是写在aspx中的。

aspx.cs是服务端,是控制程序逻辑的文件。C#代码就是写在aspx.cs中的。

aspx控制页面的长相,aspx.cs控制程序的逻辑,这种前台aspx后台aspx.cs的方式就被称为CodeBehind。

//Assembly是一个包含程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。

//使用Reflector查看后发现,aspx中的代码会编译成.net类,生成C#代码。aspx编译成的.net类是aspx.cs类的子类

//服务端控件的ID不一定等于客户端HTML中的ID,如果要在客户端通过Javascript、JQuery操作服务端控件最好不要直接写服务端ID,可以使用

document.getElementById("<%=Button.ClientID %>")的方式获取服务端控件的ID。

//响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都立即输出到浏览器,而是会先缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。

//表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。

//MIME---Multipurpose Internet Mail Extensions(多功能Internet邮件扩充):MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

HTTP请求报文:

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

GET / HTTP/1.1 //表示向服务器使用GET方式请求首页,使用HTTP/1.1协议

Accept: text/html, application/xhtml+xml, */* //客户端可识别的内容类型列表。

Referer: http://www.hopedot.cn/404.html //通过那个页面发出的请求。

Accept-Language: zh-CN //表示浏览器支持的语言。

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) //产生请求的浏览器类型。

Accept-Encoding: gzip, deflate //表示浏览器支持gzip、deflate两种压缩算法。

Host: www.hopedot.cn //请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

If-Modified-Since: Tue, 15 Nov 2011 11:29:14 GMT

If-None-Match: "2b513-3b2f-4b1c44c05d680"

Connection: Keep-Alive //本次请求之后还有别的请求,建议服务器保持连接。

Cookie: AJSTAT_ok_pages=7; AJSTAT_ok_times=3 //浏览器发送给服务器的Cookie。

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

HTTP响应报文:

HTTP/1.1 302 Found //暂时转移,使用HTTP/1.1协议。

Date: Tue, 15 Nov 2011 15:24:04 GMT //服务器返回的响应报文的时间。

Server: Apache //服务器类型。

Location: http://www.hopedot.cn/404.html //对于一个已经移动的资源,用于重定向请求者至另一个位置。

Keep-Alive: timeout=3, max=100

Connection: Keep-Alive

Content-Type: text/html; charset=iso-8859-1 //返回内容的类型和使用的编码。

Content-Length: 15151 //响应内容的字节长度。

HTTP状态码:

状态码        状态信息                                                             含义

100          Continue                                初始的请求已经接受,客户应当继续发送请求的其余总分。

200          OK                                           一切正常,对GET和POST请求的应答文档跟在后面。

202          Accepted                               已经接受请求,但处理尚未完成。

301          Moved Permanently            客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。永久转移。

302          Found                                     类似于301,但是新的URL应该被视为临时性的替代,而不是永久性的。暂时转移。

400          Bad Request                          请求出现语法错误。

401          Unauthorized                        客户试图未经授权访问受密码保护的页面。

403          Forbidden                              资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

404          Not Found                              无法找到指定位置的资源。这也是一个常用的应答。

500          Internal Server Error           服务器内部错误。

503          Service Unavailable             服务器由于维护或者负载过重未能应答。

HTTP是无状态的,不会记得上一次的请求,所以哪怕是同一个页面中的JS、CSS、JPG等都要重复的提交User-Agent、Accept、Accept-Language等。

页面中的内容并不是都在一个请求中完成的,而是每个资源一个请求。

Cookie:Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

          HttpCookie cookie = new HttpCookie("name", "张耕明");//创建cookie
          cookie.Expires = DateTime.Now.AddMinutes(10);//设置cookie的过期时间
            Response.Cookies.Add(cookie);//添加cookie
          HttpCookie cookie = Request.Cookies["name"];//获取cookie

Session:在计算机中,尤其是在网络应用中,称为“会话”。Session是用于保持状态的基于Web服务器的方法。Session允许通过将对象存储在Web服务器的内存中在整个用户会话过程中保持任何对象。

Session["name"] = Server.HtmlEncode("<h1>张耕明</h1>");//设置session
Session["name"].ToString();//获取session

IsPostBack原理解析:获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。

IsPostBack==true:当前页面响应客户端回发而加载。IsPostBack==false:当前页面正被首次加载。

<body>
    <form action="Handler.ashx" method="post">
        <input type="hidden" name="isPostBack" value="true" />//用于判断用户是否提交信息到服务器
        <input type="text" name="name" value="" />
        <input type="submit" value="提交表单" />
    </form>
</body>
          public void ProcessRequest(HttpContext context)
          {
            context.Response.ContentType = "text/html";//指出响应内容的类型
              bool isPostBack = Convert.ToBoolean(context.Request["isPostBack"]);//获取隐藏的html表单控件
              string name = context.Request["name"];//获取用户输入
              if (isPostBack)//如果为true,说明是响应客户端回发而加载,否则是首次加载。
              {
                context.Response.Write("欢迎" + name + "登录网站!");
            }
            else
            {
                context.Response.Write("用户未登录!");
            }
            string path = context.Server.MapPath("~/HTMLPage.htm");//获取html文件路径
              string content = File.ReadAllText(path);//读取文件内容
              context.Response.Write(content);//打印文件内容,将模板重绘出来
        }

服务端控件渲染到客户端HTML标签的类型:

<asp:Label ID="Label" runat="server" Text="Label"></asp:Label>//渲染为<span></span>标签
<asp:Label ID="Label" runat="server" Text="Label" AssociatedControlID="TextBox"></asp:Label>//渲染为<label for=""></label>标签
<asp:Button ID="Button" runat="server" Text="Button" onclientclick="return confirm('真的要点吗?')"/>//渲染为<input type="submit"/>标签
<asp:TextBox ID="TextBox" runat="server"></asp:TextBox>//渲染为<input type="text" />标签
<asp:TextBox ID="TextBox" runat="server" TextMode="MultiLine"></asp:TextBox>//渲染为<textarea></textarea>标签
<asp:TextBox ID="TextBox" runat="server" TextMode="Password"></asp:TextBox>//渲染为<input type="password"/>标签
<asp:CheckBox ID="CheckBox" runat="server" Text="checkbox" />//渲染为<input type="checkbox" /><label for="CheckBox"></label>标签
<asp:DropDownList ID="DropDownList" runat="server"></asp:DropDownList>//渲染为<select ><option ></option></select>标签
<asp:FileUpload ID="FileUpload" runat="server" />//渲染为<input type="file" />标签
<asp:BulletedList ID="BulletedList" runat="server"></asp:BulletedList>//渲染为<ul id="BulletedList"><li></li></ul>标签
<asp:Calendar ID="Calendar" runat="server"></asp:Calendar>//渲染为<table><tr><td></td></tr></table>标签
<asp:Literal ID="Literal" runat="server" Text="<h1>Literal</h1>" Mode="Encode"></asp:Literal>//纯文本,不会渲染为任何HTML标签。如果将Mode设置为"Encode"会自动的对"<"、">" 等符号进行转义
<asp:HiddenField ID="HiddenField" runat="server" />//渲染为<input type="hidden" />标签
<asp:HyperLink ID="HyperLink" runat="server" Target="_blank"></asp:HyperLink>//渲染为<a href="" ><img src="" /></a>标签
<asp:Image ID="Image" runat="server" ImageUrl="" />//渲染为<img src="" />标签
<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="" />//渲染为<input type="image" src="" />标签
<asp:ImageMap ID="ImageMap1" runat="server" HotSpotMode="Navigate"  ImageUrl="">
        <asp:CircleHotSpot NavigateUrl="~/HTMLPage1.htm" Target="" X=""  Y=""  Radius="" />
</asp:ImageMap>//渲染为<img src="" usemap="" /><map name="" id=""><area shape="" coords="x,y,radius" href="" /></map>标签
<asp:Panel ID="Panel" runat="server" ></asp:Panel>//渲染为<div></div>标签
<asp:Panel ID="Panel" runat="server" GroupingText=""></asp:Panel>//渲染为<div ><fieldset><legend></legend></fieldset></div>标签
<asp:RadioButton ID="RadioButton" runat="server" />//渲染为<input type="radio" />标签
<asp:RadioButtonList ID="RadioButtonList" runat="server"></asp:RadioButtonList>//渲染为<table><tr><td><input type="radio" />
<label for=""></label></td></tr></table>标签
<asp:Table ID="Table" runat="server"></asp:Table>//渲染为<table></table>标签

一些常用的操作:

Label.Text = Request["Msg"];//存在XSS漏洞,攻击者可以往Web页面里插入恶意代码。
Label.Text = HttpUtility.HtmlEncode(Request["Msg"]);//一种解决方案:对提交上来的信息进行转码处理。
Literal.Mode = LiteralMode.Encode; //Literal的这个Mode属性和HttpUtility.HtmlEncode();有相同的效果。
HttpUtility.UrlEncode("");//对字符串进行URL编码,并返回编码后的字符串。
HttpUtility.UrlDecode("");//对字符串进行URL解码,并返回解码后的字符串。
Server.Transfer("~/WebForm.aspx");//内部重定向,是服务器内部的接管,不会通知浏览器,因此浏览器地址栏不会变化。不能重定向到外部网站。
this.GetType();//获取当前执行类的类型名称。
this.GetType().Assembly.Location;//获取当前执行类的程序集位置。
this.GetType().BaseType;//获取当前执行类的父类的类型名称。
TextBox text = (TextBox)FindControl("textUsername");//根据控件的ID找到控件,FindControl()返回的是Control类型。

HttpRequest和HttpResponse的一些常用的属性:

Request.AppRelativeCurrentExecutionFilePath;//获取当前请求相对于应用根目录的虚拟路径,以'~'符号显示。
Request.PhysicalApplicationPath;//获取当前执行的应用程序的物理路径。
Request.PhysicalPath;//获取当前请求的物理路径。
Request.Url;//获取当前请求的URL信息。
Request.UrlReferrer;//获取客户端上次请求的URL信息,该请求链接到当前的URL。
Request.UserHostAddress;//获取远程客户端的IP主机地址。
Request.UserHostName;//获取远程客户端的DNS名称。
Request.RequestType;//获取客户端使用的HTTP数据传输方式。
Request.IsLocal;//获取请求是否来自本地计算机。
Request.MapPath("~/Default.aspx");//将虚拟路径转换为物理路径。
Response.Flush();//将Write出来的内容立即输出到浏览器。
Response.Buffer = false;//设置是否缓冲输出并在处理完整个响应之后发送它,默认是true。
Response.Clear();//清空缓冲区中的内容。
Response.ContentEncoding;//输出流的编码类型。
Response.ContentType;//输出流的内容类型。
Response.End();//终止响应,End之后的代码不会执行。
Response.Redirect("http://www.baidu.com");//重定向浏览器到新的页面。
Response.SetCookie(new HttpCookie("MySessionId", sessionId));//向输出流中更新写到浏览器中的Cookie,Cookie存在就更新,不存在就增加。
Response.Write("内容");//向浏览器输出内容。

禁用ViewState:默认情况下ASP.NET是启用了ViewState的,ViewState对于需要PostBack处理的页面才可能有用,对于新闻展示类的页面不需要交互,所以完全没必要用ViewState。

页面整体禁用ViewState:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" 
Inherits="WebApplication.WebForm" EnableViewState="false"%> 
指定控件禁用ViewState:设置控件的EnableViewState="False"

缓存(Cache):如果每次访问页面的时候都查询数据库生成页面内容的话,会导致网站性能下降。如果只有第一次访问的时候才查询数据库,以后都直接从缓存中取出内容,就可以提高网站性能,降低数据库的压力。缓存是改进网站性能的第一个手段,ASP.NET缓存主要分为:页面缓存、数据源缓存、数据缓存这三种主要类型。

页面缓存:页面缓存是针对所有这个页面的访问者。这样一次访问和1万次访问对数据库的压力是一样的。
<%@ OutputCache Duration="60" VaryByParam="none" %>
<!-- 页面缓存,缓存时间60秒。参数为none表示不考虑参数引起的缓存-->
<%@ OutputCache Duration="60" VaryByParam="ID;Name" %>
<!-- 根据ID、Name参数的变化创建不同的缓存-->
<%@ OutputCache Duration="60" VaryByParam="*" %>
<!-- 根据不同的参数的变化创建不同的缓存-->

数据源缓存:设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching
=True。这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,其它时候都是直接返回缓存的数据。缓存固定的时间适用于首页、文章列表等访问频繁的页面,对于看帖页面则不适合。可以使用“滑动”策略,比如帖子缓存10分钟,如果10分钟之内又访问了,则缓存的失效时间修改为从被访问这一刻起的10分钟之后。这样经常访问的帖子就可以长期缓存,而不经常访问的帖子也不会因为偶然访问而长期占用缓存。设定ObjectDataSource的CacheExpirationPolicy="Sliding"启用滑动策略。

错误页:当页面发生错误的时候,ASP.NET会将错误信息展示出来,这样的页面看上去很难看,还会泄露网站内部的一些信息,因此需要定制错误页。在发生错误时显示开发人员定制的页面。

配置Web.config:
  <customErrors mode="On" defaultRedirect="ErrorPage.htm">
    <error statusCode="403" redirect="NoAccess.htm" />
    <error statusCode="404" redirect="FileNotFound.htm" />
  </customErrors>
mode的三个可选值:
On:总是显示定制错误页面;
Off:不显示定制错误界面,直接显示调用堆栈等异常信息;
RemoteOnly:对于本机的访问显示调用堆栈等异常信息,对于外部用户显示定制错误页面。一般设置为RemoteOnly,这样管理员可以在服务器的浏览器中看到详细错误信息,非本机的访问则显示定制的错误页面。

验证码的实现:

   public class Handler : IHttpHandler, IRequiresSessionState//如果要在一般处理程序中使用Session,必须实现 IRequiresSessionState接口。
    {   
        public void ProcessRequest(HttpContext context)
        {
          context.Response.ContentType = "image/JPEG";//指出响应内容的类型。
            using (Bitmap bitmap = new Bitmap(100, 50))//初始化一张位图,使用Graphics在这张位图上进行绘制。
            {   
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    Random random = new Random();
                    int code = random.Next(0, 101);//生成一个0~100的随机数。
                       HttpContext.Current.Session["code"] = code.ToString();//为当前HTTP请求设置Session。
                       g.DrawString(code.ToString(), new Font("微软雅黑", 29), Brushes.Red, new PointF(0, 0));
                    bitmap.Save(context.Response.OutputStream, ImageFormat.Jpeg);//将此图像以指定的格式保存到指定的流中。
                   }
           }
        }
  }
<form id="form1" runat="server">//当图片加载的时候,会在当前页面设置Session。
  
<!-- 点击图片的时候,图片的src属性的值在不变的情况下浏览器不会重新发出请求。-->
  <div><img src="Handler.ashx" alt="验证码" title="验证码" οnclick="this.src='Handler.ashx?'+new Date()"/></div>
    <asp:TextBox ID="TextBox" runat="server"></asp:TextBox>
  <asp:Button ID="Button" runat="server" οnclick="Button_Click" Text="Button" />
       protected void Button_Click(object sender, EventArgs e)//每点一次服务器控件中的Button都会对页面进行一次重绘。
        {   
            string 正确的验证码 = Session["code"].ToString();
            if (正确的验证码 == TextBox.Text)//判断填入的数值是否和存入的Session值相同。
              {
                Response.Write("正确!");
            }
            else
            {
                Response.Write("错误!");
            }
        }
 
 

简易注册机原理:

        private void button_Click(object sender, EventArgs e)
        {
            timer.Start();
        }
        private void timer_Tick(object sender, EventArgs e)
        {
            i++;
            if (i>100)
            {
                timer.Stop();
            }
            /* webBrowse:WindowsForms程序中的浏览器控件*/
            webBrowser.Document.GetElementById("userName").SetAttribute("value", "zgm" + i);
            webBrowser.Document.GetElementById("userPwd").SetAttribute("value", i.ToString());
            webBrowser.Document.GetElementById("btnSubmit").InvokeMember("Click");
        }

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima/

转载于:https://www.cnblogs.com/-zgm/archive/2012/11/11/2765626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值