ASP.NET高级技术个人随笔

一.高效率分页

ListView默认的分页是先从数据库取得所有数据,然后再截取当前页面的部分,在数据量非常大的情况下,效率非常低,所以默认的分页不可用,应该是只从 数据库取得要显示的数据

(1)Sql中语句取得分页数据 select id,sitename,Row_Number() over(order by id) rownum from t_table[取得行序号] Row_Number()指的是SQL2005之后产生的计算结果集行序号(不是表的id,也不是表的行号,是查询出的结果集的重新排列之后的行序号)的函数,Row_Number()从1开始;排序规则over 取得第11条到20条的数据方法: select * from (select id,website,Row_Num() over(order by id) rownum from t_table) t where t.rownum>11 and t.rownum<20 注意:不要把id当成行号,因为删除数据之后,id不会更新,原来的id便不存在了; select id,website,Row_Num() over(order by id) rownum from t_table查出来的是一张自动添加一个叫rownum 列, 该列存放的是取出来的数据重新排列之后的行序号(从1开始), (InsertPosition="none"可以去掉一开始ListView出现的插入模板,也可以显示EmptyTemplate中的数据)

(2)在ObjectDatasource、ListView自定义分页(高效分页) 流程: <0>在强类型DataSet建两个方法:(参数和方法名不要错,和ObjectDatasource里面设置的要对应) <1>QueryCount(取多少条数据select count(*))

<2>GetPagedData(获取行序号在指定范围的数据,注意@startRowIndex,@maximumRows 不要变,否则也得改一下ObjectDatasource这两个startRowIndex和maximumRows 内的字段名) select *(select 字段1,字段2...,Row_Num() over(order by ID) rownum from 表) t  where t.rownum>@startRowIndex and t.rownum<=@startRowIndex+@maximumRows

<3>在强类型DataSet里手工添加这两个参数,在adapter的属性Parameter里添加并设置参数类型

<4>按正常流程配置ObjectDatasource,修改EnablePaging=true;SelectCountMethod=QueryCount;SelectMethod=GetPagedData 注意:如果出错检查ListView的DataPager(内置,外置-——pagedcontrolID)  datapager默认是用Postback机制,显示不到地址中,不利于网友间共享,只要指定QueryStringField属性就可以实现超链接形式分页链接

二.禁用ViewState

默认情况下Asp.Net是启用ViewState的,这样在页面会生成冗长的隐藏字段,ViewState对于需要Postback处理的页面才可能用到,对于展示类的不涉及 提交表单[Postback]的没必要用ViewState. 禁用ViewState方式: 页面整体禁用:page——EnabledViewState=“false” 控件禁用:EnabledViewState=“false” 注意:页面禁用ViewState后并没有完全去掉ViewState,只要ViewState不是太大就可以,如果 要求一点ViewState也不能有,那么则页面中不能有runat=server的form,如果页面中没有表单元素,把form去掉就可以了 如果Button等服务端控件没有放到runat=server的form中,则是不可用的

三.缓存(Cache)

如果每次进入页面的话都查询数据库生成的页面内容的话,如果访问量非常大,则会降低网站性能。而如果只有第一次访问的时候才查询数据库 生成的页面的内容,以后都直接输出内容,则可以提高系统性能,这样无论多少人来访都只访问一次数据库,数据库压力不变 缓存是一种用空间换取时间的技术,用来将一些慢速的设备中的常用数据保存到快速设备中,取数据的时候直接从快速设备里取。比如cpu二级缓存 ,windows文件读取缓存 缓存存在失效问题:为了保证从缓存中读取数据和慢速数据中的数据一致,则需要在慢速数据中对应的数据发生变化的时候,清除数据缓存中相应的数据 【长时间不访问或者缓存中原来存的数据发生改变了——需要清除缓存——重新到数据库读取】 (【缓存】)是改进网站性能的一个手段,就像【索引】是改进数据库性能的一个手段一样,Aspnet缓存分为:页面缓存、数据源缓存、数据缓存

<1>【页面缓存】

(1)给页面添加<%@ OutputCache Duration="15" VaryByParam="none'%>标签就可以启用页面缓存,这样整个页面的内容都会被缓存数据源 页面中的aspnet的代码、数据源在缓存期间都不会运行而是直接输出缓存中的内容。Duration表示缓存时间,以秒为单位,超过这个时间缓存失效。 再次生成以后会再缓存15秒。以此类推。 注意:一个缓存一个空间,一个块。单独的缓存指的是和其他缓存不一样,空间不一样,里面的数据不一样;如果VaryByParam为"none" 指没有参数,所有访问者都访问 这一个共同的缓存(比如首页),里面的数据都一样;如果VaryByParam=“id;name"加了参数,就指的是根据传的参数,一个页面一个缓存,一个空间,一个块,里面的数据都不一样,而且互不影响 (比如新闻列表页,文章内容页)

(2)缓存是针对所有这个页面的访问者,这样1个访问者和一万个访问者、一次访问和一百万次访问对数据库的压力是一样的

(3)VaryByParam设置的是给页面设置单独缓存的依据,可以根据参数亦可以是依据其他。比如:VaryByParam=“id”表示页面传过的不同参数id的页面 会有单独的缓存。如果有多个参数比如?id=8&name=tom,则可将参数用分号隔开;VaryByParam=“id;name";如果想让任何不同的查询字符串都 创建不同缓存则设置VaryByParam=“*“;就足够了;还有webUserControl也可以像页面缓存一样,设置控件的缓存 <2>【数据源缓存】 设置ObjectdataSource的cacheDuration(单位秒),Enabledcache=true.这样每隔cacheDuration指定的时间 才调用selectmethod指定的方法 来执行数据库查询,其他时候都是直接返回缓存中的数据 缓存固定时间适用于首页、文章列表等访问频繁的页面,对于看帖页面不适合。如果每个贴子设置固定缓存时间,那么对于 那些经常不访问的帖子,长期占用 缓存,是非常占用内存的,这时候可以采用滑动窗口策略,比如帖子缓存10分钟,如果10分钟内又被访问了,则缓存的失效时间修改为从被访问的这一刻 起10分钟之后,这样经常访问的帖子就可以长期缓存。设置方法: cacheExpirationPolicy="Sliding"(滑动窗口策略)

四.错误页(漏洞:利用错误页攻击(获取网站重要信息))

<1>定制错误页(错误页资源利用——加广告,网站帖子等) 配置web.config,配置customErrors区域: < customErrors mode="RemoteOnly" defaultRedirect="MyErrorPage.aspx"> <error statuscode="403" redirect="NoAccess.htm"/> <error statuscode="404" redirect="FileNoFound.htm"/></customErrors> mode三个可选值:on:总是显示定制的错误页面;off:不显示定制的错误界面,直接显示调用堆栈等异常信息;remoteonly:对于本机的访问显示调用 堆栈错误信息,对于外部用户显示定制的错误界面(推荐)

<2>错误页2 error子元素对于不同的状态码设定不同的错误页,很多网站都把404做一个特殊的错误页。没有单独设置的状态码错误 则显示在defaultRedirect中指定的页面 错误页可以使用html,aspx。在aspx页面中可以用HttpContext.Current.Server.GetLastError()拿到异常对象。一般不要把异常信息给用户。而是使用后面讲的Log4Net等将异常记录到系统日志。如果在错误页面 拿到异常对象,设置redirectMode="ResponseRewrite",应为默认是(客户端)重定向,返回到服务器就没了,所以就拿不到对象了 将错误信息写到文件里:

(在页面加载事件)Exception ex=HttpContext.Current.server.GetlastError(); File.AppendAllText(server.mapPath("~/error.txt"),ex.Message+ex.StackTrace); 也可以在定制页中判断Request.hostAddress来设置指定ip或通过session判读是否管理员来访问错误页面详细信息

posted @ 2013-01-16 18:35  创业男生  阅读(234)  评论(0编辑  收藏  举报