.net面试题(会持续更新)
1.MVC路由的理解?
url routing的作用是将浏览器的url请求映射到指定的MVC控制器的动作。
当我们在浏览器请求一个URL地址时,这个请求首先会被URLRoutingModule所截获,截获请求后会从路由中得到与当前url向匹配的RounteData对象,
然后RounteData与url封装成一个RequestContext对象,可以从RequestContext中封装的RouteData中获取Contrller名字(这时Contoller才被真正的激活),然后再去执行控制器中的Action。
2.如何优化网站?
前端:1.减少http的请求,每次发送http请求都会消耗一定的时间。
2.可以使用js缓存,浏览器缓存,能直接从缓存中读取数据,不在请求服务器。
3.使用压缩后的css和js,避免css和js的重复使用,减少 js里面的循环次数。
4.css刚在<head>里面,js放在页面的 底部。因为请求js文件很花费时间,如果放在<head>里面,会导致DOM树需要等待js文件加载完成。
后端:
5.优化SQL,避免使用*查询,使用索引,避免sp中出现大量逻辑的事务,减少in或and和or的查询使用。
6.使用memcache缓存,减少数据库的访问。
7.减少代码的层级接口,避免循环嵌套,优化算法等等。
8.读写分离,负载均衡,面向接口编程,降低耦合性。
3.系统中使用的好的技术?
服务器端采用面向接口编程,层与层之间通过接口进行依赖,下层不是直接给上层提供实现,而是提供接口,具体的实现以依赖注入的方式在运行时动态注入进去。
减少了层之间的耦合性。
数据的访问进行了读写分离,直接针对数据库进行操作,比如增删改查都是直接调用sql语句、sp以及内置函数进行实现。
4.设计模式的理解?
1.单例:保持一个类只有一个实例,并提供一个全局访问点。目的就是为了保证程序的安全性和数据的唯一性。
2.工厂模式:使用者可以不需要知道具体的实现过程,只需要知道实现的工厂就行。在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
抽象工厂:用于版本的复制。由抽象工厂类,具体工厂类,抽象产品类,具体产品类构成。
3.建造者模式:相同的方法,不同的顺序,产生不同的事件结果时。产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
由抽象建造者,具体建造者,指导者,产品角色组成。
5.IIS的工作原理
1.当客户端发送http request时,服务端的http.sys拦截到这个请求。
2.http.sys联系was向配置存储中心请求配置 信息。
3.然后将请求传入iis的应用程序池。
4.检查请求的后缀,启动aspnet_isapi.dll,这个dll是.net framework里面的,也就是这一步进入了.net framework的管线范围。
5.这个时候如果是webfom,开始执行页面的生命周期,(HttpRuntime>ProcessRequset>HttpContext>HttpHandler)。
如果时MVC,则启动mvc的路由机制,根据路由规则为url来指定HttpHandler。
6.HashTable、HashSet、Dictionary的区别
(1).HashTable不支持泛型,而Dictionary支持泛型。
(2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。
(3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取。
(4)在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
7.网站的安全性要考虑哪些方面?
sql注入、
跨脚本攻击(xss): 这个也有时被人们称作HTML注入,和sql注入原理相似,也是没有特殊字符进行处理。是用户可以提交HTML标签对网站进行重新的构造。其实在默认的情况下在asp.net网页中是开启 validateRequest属性的,所有HTML标签后会.NET都会验证:但这样直接把异常抛给用户,多少用户体验就不好。
解决方法 :通过在 Page 指令或 配置节中设置 validateRequest=false 禁用请求验证
跨站请求伪造(csrf):它可以在你不知道的情况用你的通过验证用户进行操作,所以也被称为浏览器劫持。如果你已通过某个网站的验证那么你将以你的角色对网站进行操作,比如你是管理员可以添加其它的用 户到管理组,但是如果有人构造了添加管理员的链接被管理员点后也会执行相应操作。
解决方法:修改信息时添加验证码,或添加Session令牌。
获取页面js文件加密信息
8.线程挂了会带来什么后果?
会导致该线程占有的资源无法释放,从而影响其他线程的工作。
9.asp.net和c#的本质区别是什么?
C#是一个语言,.net是一个平台。
ASP.NET是一种架构,或者说是一种平台,在这个平台下可根据需要创建网站及各种web应用程序。
C#是ASP.NET的默认语言,除此之外,使用VB也可以完成ASP.NET应用程序的开发。
10.HttpHandle和HttpMoudle的区别与联系
HttpHandle:一个HttpHanlder用于响应一类的请求,为一类的请求生成响应结果:
由于HTTP请求有很多种请求类型,比如请求aspx、html、jpg等等。因此,仅仅由HttpApplication直接处理请求时很臃肿的,而且不利于扩展。
因此Asp.net采用了抽象工厂模式来处理这些请求。Asp.net在web.config的架构中,允许我们制定某些请求映射到一个HttpHandlerFactory。
HttpMoudle:有时候有些页面需要一些相同的检查功能,比如身份验证。明显使用HttpHandler是不方便的,因为不是所有的页面都需要去调用那些相同的功能。
HttpModule的设计正是提供了一个灵活的方法解决这种功能重用的问题,它采用事件(观察者)的设计模式,将某些HttpHandler都需要的功能抽取出来,形成不同的观察者类型,这些观察者类型可 以编译成类库形式,供多个网站共用。为了让ASP.NET管线更灵活,ASP.NET允许我们再web.config中自由配置需要的HttpModule。
我们用HttpModule做什么事情?
1. 修改某些请求(例如前面的示例修改了响应头)。
2. 检查检查请求(例如身份认证检查)。
HttpModule能处理哪些请求呢?
1. 默认是全部进入ASP.NET的请求。
2. 如果只需要处理部分请求,那么请自行判断。
11.Remoting与Web Services的区别?
(1)Remoting既支持TCP信道又支持HTTP信道,传输速度快
(2)Remoting即可传输XML的SOAP包又可传输二进制流,效率高
(3)Remoteing主要用于C/S结构项目
(4)不一定要依赖IIS服务器
12.Invoke()和BeginInvoke()的区别?
Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。
13.怎么解决跨域问题?
引用js、
使用jsonp技术:
它是在文档中插入一个script标签,创建_callback方法,通过服务器配合执行_callback方法,并传入一些参数
JSONP的局限就在于,因为是通过插入script标签,所以参数只能通过url传入,因此只能满足get请求,特别jQuery的ajax方法时,即使设置type: 'POST',但是只要设置了dataType: 'jsonp',在请求 时,都会自动使用GET请求