1. MVC请求页面过程
首先从客户端发出请求开始,iis接受请求,找到web应用程序运行的工作者进程,如果进程不存在,则创建的新的工作进程。在其初始化的时候, aspnet_ isapi. dll被加载, isapi启动CLR以及相关应用程序域和相关web应用的初始化。随后,一个特殊的运行时 isapiRuntime被加载,它将接管http请求。接管http请求的ISAPIRutime会首先创建isapiWorkRequset对象来封装当前http请求,随后将此对象传递给 Httpruntime,至此,请求到达了 asp.net管道,接着就执行HttRuntime.PR方法,其中主要做了两件事。
- 根据httpworkrequset创建httpcontext对象,此对象同于表示当前请求的上下文。
- 根据httpApplicationFatory创建或获取现有的httpApplication对象
httpApplicationFatory工厂初始化的时候,从asp.net维护的httpApplication对象池中获取 httpAppliction对象,如果池子中没有对象,将通过globa文件编译的类型通过反射获取httpApplication
在 httpApplication初始化的时 asp.net会根据配置文件加载并初始化httpModule对象,httpApplication主要处理请求阶段发生的不同事件而httpmodule主要通过注册httpApplication管道中的事件,将所需要的操作注入整个流程。
宏观:
- 用户打开浏览器,在地址栏输入某个网址的URL并回车,浏览器便开始像该URL指定的服务器发起HTTP请求
- 服务器的网站服务系统(IIS)接收到该请求,先检查自己是否认识该类请求,如果认识就直接处理并发回响应,否则就将该类请求发给对应的HTTP处理程序(在此时ASP.NET的MVC)
- MVC的路由系统接收到该请求,根据HTTP请求的URL,把请求定向到指定的控制器Controller中.
- 如果控制器是MVC内置的标准的Controller,则启动Action机制;否则,根据自定义的控制器逻辑,直接向浏览器发回响应;
- MVC路由把HTTP请求定向到具体的Controller/Action中,如果Action没有使用视图引擎,则根据自定义逻辑发回响应;否则返回ActionResult给视图引擎,由视图引擎渲染呈现HTML,并发回浏览器.
2. 类和结构的区别
1)类是引用类型,结构是值类型
2)类可以继承,结构不能继承,两者都能实现接口
3)类可以有显示的无参构造函数,结构则不能
4)类可以有析构函数,结构则不能
5)结构中不能有实例字段初始值设定,类无限制
6)类的构造函数里可以不用对所有字段进行初始化,结构必须要对所有字段进行初始化
3. C#中类的访问修饰符
public:公有的,任何位置都可以访问
private:私有的,只有类的内部才能访问
protected:受保护的,只有类的内部或派生类中可以访问
internal:内部的,同一个程序集(命名空间)里面可以访问
protected internal:内部受保护的,同一个程序集里面或不同程序集派生类中可以访问
继承与派生是同一个过程从不同的角度看:
- 保持已有类的特性而构成新类的过程称为继承
- 在已有类的基础上新增自己的特性而产生新类的过程称为派生
被继承的已有类成为基类(父类)base class
派生出的新类称为派生类(子类)derived class
直接参与派生出某类的基类成为直接基类
基类的基类甚至更高层的基类称为间接基类
继承的目的:
实现设计与代码的重用,充分利用原有的类
派生的目的:
当新的问题出现,原有程序无法解决,需要对原有程序进行改造
4.抽象类和接口的区别
相同点:
1)不能被实例化
2)可以包含任意个抽象成员
不同点:
1)抽象类是类,具有类的特点:单基类继承,多接口实现;接口不是类,只能继承多个接口
2)抽象类中可以包含已经实现的非抽象成员;接口中所有成员都是抽象的,没有实现的
接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不完全的类
接口可以用于支持回调;抽象类不能实现回调,因为继承不支持
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法
接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。
5.值类型和引用类型的区别
1)值类型一般存储在线程栈上,引用类型存储在托管堆上
2)值类型的变量本身实际存储的是实际数据,引用类型的变量本身实际存储的是引用地址,实际的数据存储在托管堆上
3)在作为方法参数传递时,值类型传递的是值的副本在方法中对其修改不会影响原始值。引用类型参数传递的是引用地址,在方法中对该参数进行修改会对托管堆上该地址实际数据进行修改,从而会影响原始值
扩展:
通常来说,变量的值分配的位置与声明该变量的位置有关。局部变量的值总是在线程栈上,实例变量的值则和实例本身一起存储在实例存储的地方。引用类型实例和静态变量总是存储在堆上。
值类型也有可能分配在托管堆上:
这些特殊的情况包括数组中的元素﹑引用类型中的值类型字段﹑迭代器块中的局部变量﹑闭包情况下匿名函数(lamda)中的局部变量。
这是由于在这几种情况下的值类型实例如果分配在线程栈上,有可能会出现线程栈中的方法已经调用结束,但是还会访问这些值的情况。也就是说如果分配在线程栈上,有可能会随着被调用的方法的返回而被清除掉。因此它们也被分配在了托管堆上,以满足在方法返回之后还能够被访问的需要。
单纯的说“引用类型保存在托管堆上,值类型保存在线程栈上”是不准确的。
引用类型的确总是分配在托管堆上,但是值类型并非总是分配在线程栈上。
6.重写和重载的区别
重写:子类对基类中的虚成员(虚方法、虚属性等)或抽象成员(抽象方法、抽象属性等)进行覆盖重新实现
重载:同一个类中,同名方法具有不同的参数签名(参数个数、参数的数据类型、参数是否具有ref、out、params修饰)的实现
7.什么是GC,为什么要用到GC
GC是垃圾收集器,计算机程序运行过程中需要使用到内存,需要向操作系统申请内存空间,由于内存空间是有限的所以使用完程序需要释放内存。
垃圾收集器就是一种自动进行内存管理的机制,使得程序员不用手动去分配内存和释放内存,由垃圾收集器全权负责内存管理工作,提高了程序的安全性、稳定性、开发效率
8.什么是委托?事件跟委托是什么关系?
委托是一个类,它定义了方法的类型,使得方法可以当做另一个方法的参数来传递
事件也是一种委托
9.怎样理解web应用程序的“无状态编程”?
web应用程序是基于http协议(具有无状态性),即客户端发送http请求服务器端,服务器收到请求将内容返回给客户端,在这一过程服务器端不会记录任何客户端的信息,请求结束后服务器也不会保留此次请求的任何信息,所有相关请求都会被释放,所有请求响应都是即时的