分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

06 ASP.net

发布时间:2023-09-06 01:48责任编辑:胡小海关键词:暂无标签

ASP.net

第一天

  1. 理解浏览器与服务器概念,与WinForm的区别。

C# IIS(Internet Information Service)

互联网信息服务

Java(Tomcat)

Php(Apache)

请求处理:

什么是HTTP协议?

一个基于应用层的通信规范。

浏览器和服务器的底层通信——Socket

浏览器就是一个Socket客户端

浏览器的本质作用

1.将用户输入的URL封装为一个请求报文,

2.建立与服务器端的连接,

3.将封装好的请求报文通过socket发送到服务器端,

server.write(JSON.stringify(send));

4.接收到服务端返回的响应报文,

5.解析响应报文JSON.parse,

6.渲染内容到页面当中 console.log(msg)。

如果页面中含有图片,那么浏览器渲染从服务器返回的代码时(Html),会遇到<img>标签,那么浏览器会重新发送请求,从浏览器下载该图片。

TCP

打电话:

转换成模拟信号 再转回来

网络传输:

底层是tcp,上面是http 浏览器与服务器之间用http通信,交换机什么的用到tcp 再最后转回来

静态网站 HTML+CSS+JS 前端

动态网站 C# 服务端

.ashx

如果浏览器向服务器请求的静态资源(.html,.css,.js)

那么IIS服务器直接找到这些资源返回,因为浏览器认识,如果请求是动态资源IIS处理不了,

他一看是ashx,处理不了,只能交给.netFrameWork来处理

(是通过aspnet_isapi.dll交给.NetFrameWork来处理)

最后.NetFrameWork交给IIS,IIS再返回给浏览器

托管代码与非托管代码

托管代码调用.Net Framework来执行,非托管代码调用的是Windows系统库和MFC库

aspnet_isapi.dll无法反编译,因为它是非托管代码。

扩展程序注册在命令: aspnet_regiis –i

教程中是怎么创建的。

新建——空项目——web应用程序(空) 右键添加新建项HTML 右键添加ashx

新建一个UserList.html再新建一个UserInfoList.ashx:

aspx

webForm

上面写html,下面可以写C#

微软希望网页开发能像Winform开发一样简单。

请求报文:

响应报文:

HTTP协议内容是:

上图画的不是特别准确(懒得改了)

HTTP请求:

请求行+请求头+请求体

HTTP响应:

一个简单的表单示例

HttpRequestDemo.html

Accept.ashx

get请求

1.如果是post方式进行请求,那么表单中的数据会放在请求报文体中,发送到服务器端,如果以get方式进行请求,那么表单中的数据会放在URL地址栏中发送到服务端.(注意,表单元素必须有name属性)

  1. 在服务端接收方式 不一样,如果是post请求用request.Form如果是get请求,用request.queryString.

  1. Post请求比get请求安全,以后像注册,登录等表单都要用post提交.
  1. Post请求发送的数据要比get请求要大。

只能将表单元素的value值提交到服务端(span,div等不熟悉表单元素,所以无法提交),并且表单元素必须要加name属性

http协议的无状态特性,第二次请求不会拿到第一次请求的结果。

静态变量,一直存在内存中,把服务终止了才会取消。

public static int count = 0;

自增

int.parse()与convert.toint32()

int.parse(null) 抛出异常

convert.toint32(null) = 0

连接数据库读取表格

UserInfoList.html

UserInfoList.ashx

第二天

复习:

1.如果是post方式进行请求,那么表单中的数据会放在请求报文体中,发送到数据端,如果以get方式进行请求,那么表单中的数据会放在url地址栏中发送到服务端。(注意,表单元素必须有name属性)

2.在服务端接收方式不一样,如果post请求用request.Form,get请求用request.QueryString.

3.Post请求比Get请求安全,以后像注册,登录等表单都要用post提交

4.Post请求发送的数据要比get请求大。

注意:只能将表单元素的value值提交到服务端(span,div等不熟悉表单元素,所以无法提交),并且表单元素必须要加name属性。

继续完成了第一天任务未完成的 增删改查 其余部分。

(这里省略)

请求处理模型:

Kernal:操作系统内核

服务器:

操作系统:

Windows Server 2008

内核模式:

操作系统操作在内核模式下

用户模式:

应用软件操作在用户模式下。

KernalModeDriver:

http.sys

请求先到达服务器操作系统的内核模式。

交给http.sys---->对浏览器发送过来的数据做个基本的处理,

检查端口号等。将处理的结果转交给IIS

IIS是一个软件,工作在用户模式下。

对发送过来的请求进行判断,如果是静态资源(.html,.js,.css等)

直接找到这些资源后返回给浏览器。如果是动态资源,处理不了

交给aspnet_isapi.dll

工作进程.w3wp.exe

非托管模式:aspnet_isapi.dll ,加载.net framework

托管模式:.net framework

Web网站与Web应用程序的区别

(“项目”与”网站”)

“项目”中是先编译生成,如果有一个ashx有问题就不能打开了

而”网站”是可以单独访问编译

网站是请求编译,每个ashx单独生成一个DLL

context.Response.Write(System.Reflection.Assembly.GetExecutingAssembly().Location);

所以,网站一般都用WebApplication项目

域名与DNS(域名解析)

将域名转换成IP地址 ping www.baidu.com

一般处理程序手写三层(增删改查小项目)

第一节课:三层列表展示

再写一遍SqlHelper:

SqlHelper.cs

UserInfoDal.cs

最后运行

总结一下这个分层的项目:

第一步、首先建立这个解决方案,生成一些项目

BLL层 BusinessLogicLayer 业务逻辑层

DAL层 DataAccessLayer数据访问层

Model层 数据层

WebApp 是空白的Asp.net web应用程序

Common公用的小工具库(没用到)

第二步、在WebApp中配置web.config

第三步、写Model层(数据转对象)

UserInfo.cs:

第四步、写数据访问层DAL

中的SqlHelper.cs

写DAL业务逻辑层中的UserInfoDal.cs

第五步、写业务逻辑层BLL

第六步、在web项目中

UserInfoList.html:

UserInfoList.ashx:

第二节课:数据层构建完成(完善数据层)

UserInfoDal.cs

第三节课:三层详细展示(完善业务层)

添加 ShowDetail.html和ShowDetail.ashx

ShowDetail.html

ShowDetail.ashx:

工厂模式

//问题:业务层与数据层紧耦合

如果我写了一个CZBK.TestProject.AccessDAL类库,

那么在BLL层也要对应改好多东西

怎么解决呢,需要写一个数据层的访问接口:

添加Model引用

在DAL中引用IDAL接口

在UserInfoDal.cs中实现这些接口

改变业务层

业务层添加引用

重写

新建工厂:

添加引用:

写代码:

这时候原先的业务层也需要对应有改变

添加引用

写代码:(此时业务层和数据层完全解耦了)

*抽象工厂

修改config文件 而不是在vs里写class重新生成

总结: 工厂类=>生产对象

返回一个接口,因为

不管是SQLSERVERDal还是AccessDal 都实现这个接口

第三天

  1. 三层添加,删除,修改数据(修改部分数据)
  2. 文件上传
  3. Response.Redirect原理
  4. 一般画图 GDI+
  5. 创建图片水印
  6. 缩略图
  7. 验证码
  8. 文件下载
  9. WebForm简介列表,添加(IsPostBack原理),删除

上传图片 Enctype

<!—enctype = “multipart/form-data”:如果上传文件时必须添加该属性,将文件内容作为请求报文体一部分à

enctype的默认取值是 application/x-www-form-urlencoded

表单里如果有文件上传域必须要加enctype。

FileUpload.html

FileUpload.ashx

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "text/html";

HttpPostedFile file = context.Request.Files["fileUp"];//接收文件数据

if (file == null)

{

context.Response.Write("请选择文件");

}

else

{

//判断上传的文件的类型

string fileName = Path.GetFileName(file.FileName);//获取文件名与扩展名

string fileExt = Path.GetExtension(fileName);//获取扩展名

if (fileExt == ".jpg"||fileExt == ".gif")//获取扩展名

{

file.SaveAs(context.Request.MapPath("/ImagePath/"+fileName));//保存文件

context.Response.Write("<html><head></head><body><img src=‘/ImagePath/"+ fileName +"‘></body></html>");

}

else

{

context.Response.Write("文件类型错误");

}

}

}

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "text/html";

HttpPostedFile file = context.Request.Files["fileUp"];//接收文件数据

if (file == null)

{

context.Response.Write("请选择文件");

}

else

{

//判断上传的文件的类型

string fileName = Path.GetFileName(file.FileName);//获取文件名与扩展名

string fileExt = Path.GetExtension(fileName);//获取扩展名

if (fileExt == ".jpg"||fileExt == ".gif")//获取扩展名

{

string dir = "/ImagePath/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/"

+ DateTime.Now.Day + "/";

//创建文件夹

Directory.CreateDirectory(Path.GetDirectoryName(context.Request.MapPath(dir)));

string newfileName = Guid.NewGuid().ToString();

string fullDir = dir + newfileName + fileExt;//构建完整的文件路径

file.SaveAs(context.Request.MapPath(fullDir));

//file.SaveAs(context.Request.MapPath("/ImagePath/"+fileName));//保存文件

context.Response.Write("<html><head></head><body><img src=‘"+ fullDir +"‘></body></html>");

//最后再将上传成功的图片路径存储到数据库,

}

else

{

context.Response.Write("文件类型错误");

}

}

}

GDI绘图

压缩图片

public void ProcessRequest(HttpContext context)

{

context.Response.ContentType = "text/plain";

string filePath = context.Request.MapPath("/ImagePath/OctoCat.jpg");

using (Bitmap map = new Bitmap(40, 40))

{

using (Graphics g = Graphics.FromImage(map))

{

using (Image image = Image.FromFile(filePath))

{

g.DrawImage(image,new Rectangle(0,0,map.Width,map.Height));

string fileName = Guid.NewGuid().ToString();

map.Save(context.Request.MapPath("/ImagePath/" + fileName + ".jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);

}

}

}

}

使用集成的插值库加速:

验证码

这里略过

重定向过程

Context.Response.Redirect(“xxx.ashx”)

302重定向

重定向是两个请求,第一个请求后 服务端的响应报文里返回了一个特殊指令—302重定向指令。

文件下载

WebForm简介

一般处理程序 ashx不涉及复杂的页面的时候还可以,涉及到复杂页面的时候就太麻烦了,这时候微软给我们提供了一个叫 webform

AutoEventWireUp

IsPostBack分析

第四天

webform技术

… …

Request其他成员

可以用来做防盗链等其他的东西。

Response成员:

Response.Buffer设置为true以后,

Thread.Sleep(2000);

Response.write不会立刻输出,而是会等一会儿

ViewState使用与原理

无状态的根本原因是,浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。

应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。

一个浏览器发出的请求都是由实现了IHttpHandler接口的对象进行相应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量中早就不存在,因此不要将状态信息保存到类中。

ViewState是一个键值对

Server成员:

Server属性

Server属性是HttpServerUtility的一个实例,它提供对服务器上的方法和属性的访问。

Server对象

Server.MapPath();

Server.Execute(“../NewList.aspx”);

在一个页面中执行另一个页面,

类似于iframe

但iframe不利于SEO优化。

Server.Transfer(“../NewList.aspx”);

跟excute差不多,但是URL是后者。

Redirect是先返回一个302,再发过去,

Transfer是直接跳转了。

HtmlEncode

HtmlDecode

关闭请求验证:

第五天

Cookie介绍

  1. 请求处理过程

Url重写:伪静态

aaa.aspx?a==11-àaaa_111.aspx

  1. Cookie

cookie:一小段文本,明文。存储在客户端的浏览器内存里面或者磁盘。cookie是跟网站相关。百度可以往客户端写cookie,sina也可以写cookie,但是百度只能读取跟百度网站相关的cookie。

cookie会随着请求网站一块发送到后台【如果请求百度的时候,那么酒吧百度的cookie放到请求报文里面去,然后发送到后台。】

cookie可以设置一个Path来限制某个路径下面的页面+会把cookie发送到后台。

比如:请求图片,请求一个css、js,为了提高性能,可以通过path设置页面的所在路径,控制cookie的发送。

Cookie的域:浏览器往后台发送数据时候,要把cookie放到请求报文里面去,发送到后台,那么有个问题:请求是子域的网页,那么主域的cookie会不会发送到后台呢?

答案:是的。一块发送。如果请求时主域页面,子域的cookie时不会发送到后台的。

如果子域想让请求主域页面的时候也一块发送到后台,设置当前Cookie的域为主域就可以了。

cookie时通过响应报文的方式写到前台。最终写入Cookie时通过响应报文头来的

cookie有限制(大多数浏览器)

【response.cookie】

请求处理模型3

Cookie文档分析

回顾

IIS请求流程:

第六天

复习请求处理过程

JSON简介

第七天

第八天

Cache

自定义缓存:

依赖项:数据库改变后通过通知缓存,来更改销毁缓存。

页面缓存(一般给网站首页做)

数据源缓存(依赖于Webform中的一个控件,了解,并没有什么卵用)

文件缓存依赖

监视文件是否有变化,然后进行操作

进程外Session

应对集群时在不同的服务器上Session的存储的问题

数据库缓存依赖

监视数据库中的表是否有变化,然后进行操作

ajax控件

错误页配置与网站发布

网站发布NTFS(FAT32)

右键、发布。 这样会生成DLL,更安全,就不会被看到源代码了。

发布完后打开IIS部署网站。

在IIS上修改404页面也可以。

HttpModule

Global文件

//在线人数统计

最后一天

复习

Application对象

Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束,Application对象被自动撤销。因此Application对象中的变量也有相同生存期,并且变量可以被Web应用程序中的所有网页访问。因此,可以在Application对象中建立一些全局的公用变量,由于存储在Application对象中的数值可以被应用程序的所有网页读取,所以Application对象的属性也适合在应用程序的网页之间传递信息。

Application对象主要有以下用途:

  1. l 存储记录在线人数或访问网站总人数的变量。
  1. l 存储网站共用最新消息,供所有网页更新。
  2. l 记录网站中个网页同一条广告被点击的次数或时间。
  3. l 存储供所有网页使用的数据库数据。
  4. l 不同用之间通讯,例如多用户聊天室,多用户游戏等

关于 ASP.NET 的 Application 的用法,与 Session 非常不同。下面来看看详细的介绍:

Session的用法

一、Session.Add 名称相同时,不会重复,而是覆盖。

?

1

2

3

Session.Add("s1", 1);

Session.Add("s1", 2);

// s1 最终只有一个值,就是 2。

二、名称忽略大小写。

?

1

2

Session.Add("s1", 1);

Response.Write(Session["S1"]); // 值为 1

三、Session Add 后立刻就可取到值(Remove 同理),这点不同于 Cookie,Cookie 要等到下个页面才有。

?

1

2

Session.Add("s1", 1);

Response.Write(Session["s1"] == null); // False,它不为 null

四、存储的 Session 数据类型为 object,最好用 Convert 转换。

?

1

Convert.ToInt32(Session["s1"]);

如果转换为 string 最好用 Convert.ToString(),而不是 Session["s1"].ToString(),因为如果 Session 为 null,用后法就会报错。

五、在类中使用 Session。

?

1

System.Web.HttpContext.Current.Session

Application 的用法

名称重复问题

?

1

2

3

4

5

6

7

8

HttpContext.Current.Application.Add("key1", "value1");

HttpContext.Current.Application.Add("key2", "value2");

HttpContext.Current.Application.Add("KEY2", "value3"); // name 忽略大小写

int count = HttpContext.Current.Application.Count; // 3

string[] keys = return HttpContext.Current.Application.AllKeys; // key1、key2、key2

string s = (string)HttpContext.Current.Application.Get("key2"); // value2

string s2 = (string)HttpContext.Current.Application.G

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved