值得收藏的ASP.NET基础学习笔记
Asp.net的基础学习笔记,值得收藏,可以分享给大家。
1.浏览器-服务器B/S浏览介绍
浏览器和服务器之间的交互形成了B/S模式的上网方式
对于传输到服务器的HTML,服务器软件(IIS)直接读取静态页面代码,然后返回浏览器
对于服务器软件(IIS)的ASPX传递服务器,IIS发现它无法处理aspx文件,因此它转到映射表,并根据后缀名称找到响应处理程序(isapi,服务器扩展程序)。问题3360 IIS如何调用可扩展程序?一个:可扩展程序首先根据IIS提供的借口实现代码,所以IIS知道怎么调用。
2.ASP.NET是什么
!Asp.net是一个动态网页技术,它运行。net代码,动态生成HTML,然后响应浏览器
*注意,主要操作是服务器操作,浏览器只传输指令。
!可以使用JavaScript和DOM在浏览器端做很多工作,但是在浏览器端有很多工作是做不到的,比如存储数据、访问数据库而不需要复杂的业务逻辑操作、安全性要求高的逻辑操作。
!服务器端控件和html控件的生成关系是:服务器端控件可以在aspx页面中使用,以简化打开。但是,浏览器只识别HTML,因此当请求包含服务器端控件的页面时,页面中的服务器端控件将被组装成相应的HTML控件代码字符串,如TextBox : input type='text'/
!Asp.net:ASHX(通用处理程序)(服务器上运行最快的),Web窗体,WVC 3(模型,视图,控制器)
!服务器控件不是新控件,html标记仍然在浏览器端生成。服务器控制虽然好用,但是也有缺点,到处用服务器控制不好,后面会详细介绍。
3.aspx.net通用文件(要点)
第一个小例子:动态登录程序
public void process request(HttpContext上下文){ string modelPath=context。server . MapPath(' loginmodel . htm ');字符串htmlSendBack=系统。输入输出文件。ReadAllText(模型路径);语境。响应。内容类型='文本/纯文本';语境。响应.写(html sendback);if(!字符串。is ullrempty(context . request . form[' txt name ']){ if(context . request . form[' txt name ']=' Zhu ' context . request . form[' txt assword ']=' 123 '){ context . response . write);} else上下文。响应。写入('登录失败!');} }4.通用处理程序(HttpHandler)
I .通用处理程序(HttpHandler):
是一个实现系统特殊接口的类。Web.IHttpHandler .
任何实现IHttpHandler接口的类都可以用作外部请求目标程序:(任何不实现此接口的类都不会被浏览器请求)
其次,它由支持ASP.NET的服务器调用和启动。一个HttpHandler程序负责处理与其对应的一个或一组URL地址的访问请求,接收客户端发送的访问信息并生成相应的内容。
第三,我们可以创建自己的HttpHandler程序来生成浏览器代码,并将其返回给客户端浏览器
4.HttpHandler程序可以完成普通程序能完成的大部分任务:
1.客户端在湖区通过HTML表单提交的数据和URL参数
2.向客户端创建响应信息内容
3.访问服务器的文件系统
4.连接数据库并基于数据库开发应用程序
5.调用其他类
5.请求相应的程序
1.用户在浏览器地址栏中输入:http://localhost :80777/first buffer . ash x2。当服务器收到用户的请求时,它发现这是对。ashx文件,然后将请求提交给框架执行。fw先找到对应的文件. ashx,执行后,生成的字符串(通常是html css javascript格式)会返回给浏览器。3.浏览器接收服务器返回的数据,按照http语法进行解释和执行,并以界面的形式显示给用户。(此时如果html等代码包含外部文件,则单独发送服务器对应的文件数据。)
6.6的详细说明。HTTP请求
7.ashx?-HttpHandler(通用处理程序)
IHttpHandler hander=new page class();汉德。ProcessRequest();//调用的page类中的方法,这是接口的优势
ContentType标记被放回网页中对象的解释语言中
使用html语言翻译文本/html
是设置服务器发送的响应消息的ContentType属性,浏览器根据这个属性内容使用不同的方法处理响应消息
8.编译过程
1.每个请求将创建一个HttpWorkerRequest和一个HttpApplication2。httpworkerrequest包含每个请求消息中的数据。3.HttpApplication对象包含每个请求要执行的代码。4.为每个请求创建一个单独的httpapplication对象,然后该请求的所有运行过程都将在该对象中完成。
工厂了解: HttpApplication池,每次HttpApplicationFectory都会找出这个池中是否有闲置的HttpApplication对象,如果有,直接拿出来使用,如果没有,新建一个。
服务器做什么:接受浏览器请求,创建page类的对象,实现接口,调用里面的方法,返回相应的东西
来自这个类的HttpRuntime处理所有请求,并且它可以工作
1.分析请求消息并将消息数据封装到一个名为HttpWorkerRequest类对象中。2.创建一个HttpContext对象,次要对象是当前请求上下文,它包含了处理请求的所有参数数据。最重要的是HttpRequest和HttpResponse。3.HttpRequest主要包含所有的请求信息,这些信息来自于HttpWorkRequest对象。对象包含属性:Form(客户端连接数据)QueryString(客户端url参数)4。HttpResponse主要包含一个FileStream对象,用于保存页面类执行过程中要输出到浏览器的数据。5.通过调用HttpApplicationFectory类的静态方法,在HttpApplication类对象中创建相应的属性。6.因为请求的页面类对象中的ProcessRequest方法应该在HttpApplication中运行,所以需要将HttpContext对象传递到HttpApplication中(IHttpHandler hander=通过反射创建请求的页面类对象)?
执行HttpApplication的ProcessRequest方法(这个方法的执行过程可以看作是一个流水线)。在这个方法中,应该按顺序执行19个委托事件
在第八个事件中,在创建请求的页面类的11个和12个对象中,执行了创建的页面类的ProcessRequest方法
9.服务器如何接收和发送数据?
HTTP请求响应
9.1请求(HttpRequest)响应(HttpResponse)
首先,浏览器提交数据模式1的表单(数据隐藏在请求的样式中,格式为txtname=jamwstxtpwd=123)
formaction=' login.ashx '方法=' post ' input type=' text ' name=' txt name '/input type=' password ' name=' txt pwd '/form 2地址栏URL参数(与表单的Get方法相同):键值对浏览器请求属性http://127 . 0 . 0 . 1/log in . ashx txt name 1=jordantxtpwd 1=123
二、服务器如何获取浏览器提交的数据?1获取表单数据上下文. request.form ['txtname'] 2获取URL参数: context . request . query string[' txt name 1 ']
第三,服务器如何向浏览器输出参数
语境。回应.写(‘我是服务器输出到浏览器的数据!’);
当用户单击浏览器中的提交按钮时,浏览器会自动帮助我们将表单中名称为的控件的值作为[http请求样式]提交给服务器,方法是为字符串赋值。
请求本身也可以看作是客户端提交的所有参数。请求。表格仅包含客户通过邮寄提交的数据。QueryString只包含客户端通过get提交的数据。
Get : get,拿着它——当浏览器发送请求消息从服务器获取数据时,使用getpost :传递,如果是,就发送。-当浏览器发送传递参数的请求消息时,使用post
公共无效进程请求(HttpContext上下文){上下文.响应。content TYPe=' text/html ';新系统文本。StringBuilder();sbHTML .追加(' htmlheadtitle登录页面/title/head dyform操作=' 03登录。ashx ' method=' post ' ');sbHTML .追加('用户名:输入类型=' text ' name=' txt name '/br/');sbHTML .追加('密码:输入类型=' password ' name=' txt wd '/br/');sbHTML .追加('输入类型='提交'值='登录/a href='04Reg.ashx?a=222 '注册/a br/');sbHTML .追加('/表单/正文/html ');语境。回应。写(sbHTML .ToString());//获得浏览器表单邮政方式传递来的值字符串结构名称=上下文。请求。表单[' txt名称'];if(!字符串IsNullOrEmpty(strUserName)){ context .回应。写下('表格中的值: ' strUserName);} //获得浏览器表单得到方式传递来的值string strUserNameGet=context .请求。查询字符串[' txt name '];if(!字符串IsNullOrEmpty(strussernameget)){ context .响应。写入(' Url中得到的值: ' StrusernameGet);} }9.2请求(HttpRequest)重要成员
重定向原理图如下:
-模拟wubForm的用户控件数据保持-
公共无效进程请求(HttpContext上下文){上下文.响应。content TYPe=' text/html ';字符串strNum1=上下文。请求。表单[' TxtNum 1 '];字符串strNum2=上下文。请求。表单[' TxtNum 2 '];//判断是否格式正确字符串结果=' 0 ';int num1=0,num 2=0;if(!字符串IsNullOrEmpty(strNum1)!字符串IsNullOrEmpty(strNum2)) { if (int .TryParse(strNum1,out num1) int .TryParse(strNum2,out num2)) { result=(num1 num2).ToString();} else { result='输入格式错误;} }系统。文字。新系统.文字。StringBuilder();sbHTML .追加('!DOCTYPEhtmlheadtitle计算器/title/head dy form action=' 06 compute。ashx ' method=' post ' ');sbHTML .追加('输入类型=“文本”名称='txtNum1 '值num1 .ToString()' '/input type=' text ' name=' TxTNum2 ' value=' num 2 ' .ToString() ''/=输入类型=' text ' readonly=' readonly ' value=' result .ToString()" " br/);sbHTML .追加('输入类型='提交'值='计算/br/');sbHTML .追加('/表单/正文/html ');语境。回应。写(sbHTML .ToString());} - 模拟网络表单回传检查机制-
公共无效进程请求(HttpContext上下文){上下文.响应。content TYPe=' text/html ';字符串strNum1=上下文。请求。表单[' TxtNum 1 '];字符串strNum2=上下文。请求。表单[' TxtNum 2 '];//判断是否格式正确字符串结果=' 0 ';int num1=0,num 2=0;//如果包含隐藏域的话,才执行相加操作if(!字符串IsNullOrEmpty(上下文。请求。表单[' hidIsPostBack ']){ if(!字符串IsNullOrEmpty(strNum1)!字符串IsNullOrEmpty(strNum2)) { if (int .TryParse(strNum1,out num1) int .TryParse(strNum2,out num2)) { result=(num1 num2).ToString();} else { result='输入格式错误;} } }系统。文字。新系统.文字。StringBuilder();sbHTML .追加('!DOCTYPEhtmlheadtitle计算器/title/head dy form action=' 06 compute。ashx ' method=' post ' ');sbHTML .追加('输入类型=“文本”名称='txtNum1 '值num1 .ToString()' '/input type=' text ' name=' TxTNum2 ' value=' num 2 ' .ToString() ''/=输入类型=' text ' readonly=' readonly ' value=' result .ToString()" " br/);sbHTML .追加('输入类型='提交'值='计算/br/');sbHTML .追加('输入类型='隐藏'名称='hidIsPostBack '值='1' /表单/正文/html ');语境。回应。写(sbHTML .ToString());} - 基于面向对象的计算器-
//- 类定义- ///摘要///一个计算器类////汇总公开课1 {//第一个操作数public int num1 { get设置;} //第二个操作数public int num2 { get设置;} //操作符公共字符串calculateChar { get设置;} //结果公共字符串结果{获取设置;} public Class1() { } ///summary //计算结果////summary ///param name='a '第一个操作数/param ///param名称='b '第二个操作数/param ///param name='oper '操作符/param public void GetResult(int a,int b,string oper){ this。num 1=a;这个。num 2=b;this.calculateChar=oper开关(这个calculateChar) { case ' ' :结果=(num1 num2).ToString();打破;案例'-' :结果=(num1 - num2).ToString();打破;大小写' *' :结果=(num1 * num2).ToString();打破;案例'/' :结果=(num1/num2).ToString();打破;} }} //- 页面类-public class _ 07计算四个: IHttpHandler { public void process request(HttpContext context){ context } .响应。content TYPe=' text/html ';//实例化一个计算器对象class 1 calc=新的class 1();字符串strNum1=上下文。请求。表单[' TxtNum 1 '];字符串strNum2=上下文。请求。表单[' TxtNum 2 '];字符串strOper=上下文。请求。表单[' option oper '];int num 1=0;int num 2=0;if(!字符串IsNullOrEmpty(上下文。请求。表单[' hidIsPostBack ']){//模拟回访if(!字符串IsNullOrEmpty(strNum1)!字符串IsNullOrEmpty(strNum2)) { //判断为空if (int .TryParse(strNum1,out num1) int .TryParse(strNum2,out num2)) { //判断格式加尔各答GetResult(num1,num2,strOper);} else { calcu.result='参数格式不正确;} } }系统。文字。新系统.文字。StringBuilder();sbHTML .追加('!DOCTYPE html head/head dy form action=' 07 calculate four。ashx ' method=' post ' ');sbHTML .追加(' input type=' text ' name=' TxTNum1 ' value=' calc。数字1。ToString()' '/');sbHTML .追加(“select name=”option oper”选项值=“calc”。calculatechar ' ' '计算。calculatechar '/option option value=' '/option option value='-'-'/option option value=' * */option option value='/'//option/select ');sbHTML .追加(' input type=' text ' name=' TxTNum2 ' value=' calc。数字2。ToString()' '/=');sbHTML .追加('输入类型=' text ' readonly=' readonly ' name=' txtResult ' value=' calc。结果' '/');sbHTML .追加('输入类型='提交'值='计算'/' );sbHTML .追加('输入类型='隐藏'名称='hidIsPostBack '值='1'/表单/正文/html ');语境。回应。写(sbHTML .ToString());}10.注意,关于提交表单的内容
•只能为输入,文本区域,选择三种类型的标签,只有输入(文本框/CheckBox等)用户才可以填写值,标签,p,字体等标签仅提供显示用,没有提交到服务器的必要。•只有价值属性的值才会提交给服务器,以投入标签为例,输入标签有标题、类型、禁用等属性,但这些属性都是供显示用的,用户不能修改,只有价值属性才是用户输入的属性,因此只有价值属性的值才会被提交到服务器•标签必须设置名字属性。学习师的时候我们知道,如果通过爪哇岛描述语言操作标签,必须为标签设定编号属性。如果要将标签的价值属性提交到服务器,则必须为标签设定名字属性,提交到服务器会以"名称=值"的键值对方式提交给服务器,用隔开,除了单选按钮等少数标签,那么可以重复,其他名字都不能重复。名字是给服务器用的,id是给数字正射影像图用的,对于单选按钮,同名字的为一组,选中的单选按钮的价值被提交到服务器。•如果设置了控件的有缺陷的属性的话,浏览器不会把数据交给服务器•放到形式标签内,只有放到形式标签才可能会被提交到服务器,形式之外的投入等标签被忽略。
11.使用模板清除代码,并使用虚拟模板网页
使用隐藏字段模拟ispostback,模板网页中输入类型=' hid ' name=' hid ispostback ' value=' true '/当涉及到修改后的值时,可以使用占位符,然后直接替换,使用{name}的形式
public class _ 08Cal : IHttpHandler { public void process request(HttpContext context){ context }。响应. ContentType=' text/html ';//-读取html内容模板。-根据虚拟路径string path=context . server . mappath获取物理路径('//请仔细记住,string strtml=system . io . file . readall text(路径);//记住//也在这里。//-字符串strNum2=上下文。请求.表单[' TxtNum 2 '];int num 1=0;int num 2=0;字符串结果=' ';if(!字符串。IsNullOrEmpty(上下文。请求。表单[' hidIsPostBack ']){ if(!字符串。IsNullOrEmpty(strNum1)!字符串。IsNullOrEmpty(strNum2)) { if (int。TryParse(strNum1,out num1) int。TryParse(strNum2,out num2)) { result=(num1 num2)。ToString();} else {result='错误的输入格式';}} num1。ToString())。替换(' {num2} ',num2。ToString())。替换(“{result}”),结果。ToString());语境。response . Write(strHTML);} public bool IsReuse { get { return false;} } }///-模板网页显示。doctype html public '-//W3C//dtd XHTML 1.0 transitional//en ' ' http://www.w3.org/tr/XHTML 1/dtd/XHTML 1-transitional . dtd ' html标题计算器/标题/标题正文表单动作='06Calculate.ashx '方法='post '输入类型='text '名称='txtNum1 '值='{num1}' /输入类型='text '名称='txtNum2 '值='{num2}'/=输入类型='text' readonly='表单提交方法获取和发布
get传输的数据量有限,post发送的数据量不受限制。post会导致刷新和重新提交表单的问题,但是get没有这样的问题,可以通过重新点击地址栏来解决。分割后,网址中有汉字,将按网址编码
只有在表单字段中设置了名称,参数才会被传递,get才能看清楚,如果submit有值,它也会被传递
13.数据增加
http是无状态的。每次浏览器请求服务器的page类时,服务器都会创建这个类的一个对象,调用里面的方法来执行,最后将输出结果返回给浏览器,然后对象被销毁,断开连接。浏览器和服务器彼此不认识
Connection: Keep-Alive告诉服务器,浏览器想要使用的长连接和短连接相当于一次性连接
短连接的缺点:虽然客户只想访问一个页面,但是html仍然会向浏览器发送许多新的连接请求,建立许多新的连接,这消耗了双方的时间和资源
http短连接:服务器在响应来自浏览器的请求后立即关闭当前套接字。
长连接:服务器不会在发送数据后立即关闭连接通道(套接字),而是会等待一段时间(2秒)。两秒钟内,如果同一个浏览器再次发送请求,它会继续使用这个连接通道向浏览器输出数据,然后登录一段时间。直到2秒钟后没有新的请求,服务器将关闭连接通道。
反编译工具不断寻找和理解原理和运行机制——牛人
General handler _ simple request,关于ContentType,get url参数(http参数get/post传输本质)。(请求流程原则;总体请求流程原则、页面编译流程)、请求数据和接受数据及定向原则、模拟WebForm返回检查机制、模拟wubForm用户控制数据保留、自增(解决http无状态)、登录流程
下一项研究是:
添加计算器,添加,删除,检查和更改,建立三层结构,列表和删除,删除信息功能,添加
上传单个文件,生成缩略图,通过通用处理程序输出图片(简单验证码图片),输出水印图片,就近下载,回顾总结。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:值得收藏的ASP.NET基础学习笔记是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。