ASP.NET笔记之 viewstate与cache的使用

1、

(1、默认情况下ASP.Net是启用ViewState的,这样在页面中会生成冗长的隐藏字段,ViewState对于需要PostBack处理的页面才可能有用,对于新闻展示页面不需要交互完全没必要用ViewState。

(2、禁用ViewState的方式:
• 页面整体禁用ViewState:在顶部Page中EnableViewState="False"
• 指定控件禁用ViewState,在控件上EnableViewState="False"

(3、页面禁用ViewState以后并没有完全去掉ViewState,只要ViewState不是很大就可以了。如果要求一点儿ViewState都不能有,那么则页面中不能有runat=server的form,如果页面中没有表单元素,把form完全去掉就可以。如果Button等服务端控件没有放到runat=server的form中,那么则是不可用的。

2、cache

(1、如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差。而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能。这样无论有多少人访问都只访问一次数据库,数据库压力不变。

缓存是一种用空间换取时间的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取。比如CPU二级缓存、windows文件读取缓存。

缓存存在失效的问题:为了保证从缓存中读取数据和慢速数据中数据一致,则需要在慢速数据中对应的数据发生变化的时候,清除缓存中相应的数据。
缓存是改进网站性能的第一个手段,就像索引是改进数据库性能的第一个手段一样。
ASP.net缓存主要分为:页面缓存、数据源缓存、数据缓存这三种主要类型。

(2、页面缓存

给页面添加下面的标签就可以启用页面缓存,


代码如下:

<%@ OutputCache Duration="20"  VaryByParam="none"%>

这样整个页面的内容都会被缓存,页面中的ASP.Net代码、数据源在缓存期间都不会被运行,而是直接输出缓存的页面内容。 Duration表示缓存时间,以秒为单位,超过这个时间则缓存失效,再次生成以后会再缓存20秒,以此类推。在Page_Load处设置断点、修改数据库数据测试。
      缓存是针对所有这个页面的访问者。这样1个访问者和1万个访问者、一次访问和100万次访问对数据库的压力是一样的。

***对于看新闻页面来讲,如果如上设置的话,则会缓存在第一个看到的新闻,因为?id=2、?id=3只是页面的不同参数而已,为了能让不同的新闻各自缓存,因此可以设置VaryByParam="id"表示对于不同的id参数进行单独缓存如果有多个确定缓存的参数,则将参数名用分号隔开即可,比如VaryByParam="id;number"。
      如果想让任何不同的查询字符串都创建不同的缓存,则设置VaryByParam="*",一般情况下设置“*”就足够。
      在WebUserControl中也可以像页面缓存一样设置控件的缓存。

(3、 数据源缓存
      设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching=true。这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,其他时候都是直接返回缓存的数据。

缓存固定的时间适用于首页、文章列表等访问频繁的页面,对于看贴页面则不适合,假设有100万个帖子,如果每个帖子都是固定缓存1小时的话,假设一小时之内有10万个帖子被看了,那么就要缓存十万个帖子,非常占用内存,因为“百年一看”的“坟帖”偶然被访问一次也缓存一个小时,占用内存。这时候可以采用“滑动窗口(sliding)”策略,比如帖子缓存10分钟,如果10分钟之内又访问了,则缓存的失效时间修改为从被访问这一刻起的10分钟之后,以此类推。这样经常访问的帖子就可以“长期缓存”,而不经常访问的帖子也不会因为偶然访问而长期占用缓存。设置方法,数据源:CacheExpirationPolicy="Sliding"。面试可聊。todo:貌似滑动有问题。不是问题,Sliding只是策略,服务器会参考。

(4、 缓存其他
     页面缓存、数据源缓存等内部都是使用HttpRuntime.Cache来实现缓存的,在一些页面缓存、数据源缓存完成不了的特殊的缓存要求中,可以直接调用HttpRuntime.Cache进行缓存。

(*)ASP.Net缓存默认是保存在内存中的,还可以配置保存到数据库中。大型网站还会配合使用Memcached等技术。
清除缓存。在缓存还未失效的时候可能需要立即清空缓存,让数据库的修改立即反映到界面中。ASP.Net没有提供现成的方法,可以使用Hack级别的代码。

3、错误页面

(1、当页面发生错误的时候,ASP.Net会将错误信息展示出来,这样一来不好看,二来会泄露网站的内部实现信息,给网站带来安全隐患,因此需要定制错误页,发生错误时显示开发人员定制的页面。404页面放点广告也是好的嘛。
配置web.config,配置system.web内的customErrors区域:


代码如下:

<customErrors mode="On" defaultRedirect="~MyErrorPage.aspx">
 <error statusCode="403" redirect="~/NoAccess.htm" />
 <error statusCode="404" redirect="~/FileNotFound.htm" />
 </customErrors>

**mode三个可选值:On:总是显示定制错误页面;Off:不显示定制错误界面,直接显示调用堆栈等异常信息;

**remoteonly:对于本机的访问显示调用堆栈等异常信息,对于外部用户的显示定制错误页面

一般设置为RemoteOnly,这样发生错误的话,管理员可以在服务器的浏览器中看详细错误信息,普通用户看不到。

学习演示的时候mode设置为On,否则看不到定制页。可以在定义错误页中判断Request.UserHostAddress来设置某些ip看到异常信息,可以读取Session如果是管理员则可以看异常信息。

(2、error子元素设定对于不同状态码使用不同的错误页,很多网站把404做一个特殊的错误页。没有单独设置的状态码错误则显示defaultRedirect中指定的页面。
错误页即可以使用htm页面,也可以使用aspx页面。在aspx页面中可以用HttpContext.Current.Server.GetLastError()拿到异常对象。一般不要把异常信息显示给用户,而是使用后面讲的Log4Net等将异常记录到系统日志。

*****如果要在错误页面中拿到异常对象,比如customErrors中设置redirectMode="ResponseRewrite",因为默认是客户端重定向(redirectMode="ResponseRedirect"),在错误页面中就拿不到异常对象了。*****


代码如下:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~MyErrorPage.aspx">
<error statusCode="403" redirect="~/NoAccess.htm" />
<error statusCode="404" redirect="~/FileNotFound.htm" />
</customErrors>

(0)

相关推荐

  • Asp.net中static变量和viewstate的使用方法(谨慎)

    在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是处理过的值,直接拿来用就可以了. 现在转入了BS软件开发,我们很自然地会沿用这种习惯.如在页面中统计某个按钮被按下的次数,先在类中OnClick事件的处理过程前定义一static变量times,则每次调用该按钮的OnClick事件时,令times增1即可,非常方便: [C#]: 复制代码 代码如下:

  • asp.net 禁用viewstate在web.config里

    复制代码 代码如下: <pages enableSessionState="true" enableViewState="false" enableViewStateMac="false" />

  • asp.net viewstate 回发机制

    所谓回发机制,其实说白了就是自己发送给自己(本页面)而已.下面我们新建一个网站,打开默认添加的Default.aspx页面,form部分代码如下: 复制代码 代码如下: <form id="form1" runat="server" > <div> </div> </form> 下面是运行页面后的HTML代码: 复制代码 代码如下: <form name="form1" method=&quo

  • asp.net 处理原文件中过长的viewstate代码

    复制代码 代码如下: public class XVPage : Page { static private DirectoryInfo _Dir; private DirectoryInfo Dir { get { if (_Dir == null) { _Dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data")); if (!_Dir.Exists) _Dir.Cr

  • asp.net 去除viewstate第1/2页

    看下这段代码:生成了这么多的一段东西,这段东西对seo一点好处也没有.而我要做的就是去掉它,但有一点,去掉但不能让它原来的控件和内容都发生变化,比如说不能使用等等.所以我要做的仅仅是用另一种方式去保存这些数据.这是一段用base64编码的数据而并不是加密,我很好奇到底放了些什么东西在这里面.下面我开始破解这段代码.代码如下: 复制代码 代码如下: string str = "/wEPDwUKLTY4MTg1OTU4Nw9kFgJmD2QWAgIED2QWAgIDD2QWEGYPFgIeBFRle

  • asp.net生成静态后冗余代码,去掉viewstate生成的代码

    看着自己网站编译之后的源文件,里面很多乱七八糟的东西,看了就觉得不舒服 复制代码 代码如下: <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE3NjgxMzM0MDIPZBYCZg9kFgIC-- 还有form源文件,一看就知道是asp.net的页面 复制代码 代码如下: <form name="form1&quo

  • asp.net中ViewState的用法详解

    在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有控件在ViewState中的状态值.ViewState是一个名称/值的对象集合.当请求某个页面时,ASP.NET会把所有控件的状态序列化成一个字符串,然后作为窗体的隐藏属性送到客户端,当客户端吧页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值. 当我们在写一个asp.net表单时, 一旦标明了 form runat=server ,那

  • ASP.NET笔记之页面跳转、调试、form表单、viewstate、cookie的使用说明

    1.页面跳转: (1 服务器传输 server.Transer(http://www.jb51.net);在定向到新页面后,还是会显示原来的URL,浏览器返回不会退回到原页面,历史记录也不会记录. 应用于完整的控制传输,例如安装向导. (2 超链接 (3 浏览器重定向 Redirect ,速度快,没有发送到服务器 (4 跨页发送 PostBackUrl="http://www.jb51.net" /> IsCrossPagePostBack用来判断是否为跨页提交 IsPostBa

  • asp.net 生成静态时的过滤viewstate的实现方法

    复制代码 代码如下: public static string GetSourceTextByUrl(string url) { WebRequest request = WebRequest.Create(url); request.Timeout = 200000;//20秒超时 WebResponse response = request.GetResponse(); Stream resStream = response.GetResponseStream(); StreamReader

  • ASP.NET笔记之 viewstate与cache的使用

    1. (1.默认情况下ASP.Net是启用ViewState的,这样在页面中会生成冗长的隐藏字段,ViewState对于需要PostBack处理的页面才可能有用,对于新闻展示页面不需要交互完全没必要用ViewState. (2.禁用ViewState的方式:• 页面整体禁用ViewState:在顶部Page中EnableViewState="False"• 指定控件禁用ViewState,在控件上EnableViewState="False" (3.页面禁用View

  • ASP.NET笔记之CKEditor的使用方法

    1.CKEditor原名FckEditor,著名的HTML编辑器,可以在线编辑HTML内容.自己人用CKEditor,网友用UBBEditor. 配置参考文档,主要将ckeditor中的(adapters.images.lang.plugins.skins.themes.ckeditor.js.config.js.contents.css)解压到js目录,然后"显示所有文件",将ckeditor的目录"包含在项目中",在发帖页面引用ckeditor.js,然后设置多

  • ASP.NET笔记之广告控件的使用方法

    广告控件的使用方法: 广告文件是一个XML文件,广告文件中所有的标签属性被分析后放到adProperties字典中,用以属性编辑. ads.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <!--广告文件是一个XML文件--> <Advertisements>   <Ad>     <ImageUrl>4rwbgzby.gif</Image

  • ASP.NET笔记之 ListView 与 DropDownList的使用

    1.Repeater用来显示数据.ListView用来操作数据 InsertItemTemplate和updateItemTemplate**Eval(显示数据)和Bind(双向绑定:不仅是需要展现,更需要把数据绑定到数据库中) ItemPlaceholderID:占位符,决定占位,把头部(之上)和尾部(之下)分隔开ItemTemplate:展示功能 自动生成的ListView需要调整的地方(1.生成的样式要提到style中,不要用内联的方式(2.ItemTemplate里面一半没必要用<asp

  • asp.net中Session缓存与Cache缓存的区别分析

    其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息. Session则保存对话信息. Application则是保存在整个应用程序范围内的信息,相当于全局变量. Session用的比较多. Session缓存与Cache缓存的区别,可以参考如下的几点: 1.最大的区别是Cache提供缓存依赖来更新数据,而Session只能依靠定义的缓存时间来判断缓存数据是否有效. 2.即使应用程序终止,只要Cache.Add方法中定义的缓存时间未过期,下次开启应用程序时,缓存的数据依然存在.

  • ASP.NET笔记之 Repeater的使用

    1.数据绑定combox-->BingdSource-->ObjectDataSource //连接数据库**后台代码: T_UserTableAdapter adpter=T_UserTableAdpter();adpater.调用T_User表的自定义方法 //设置初始数据:AppenddateBource="true"; 2.Repeater 动态显示数据表中所有数据:(相当于一个for语句我觉得) #代表绑定数据(1.模板:<ItemTemplate>主

  • ASP.NET笔记之Session、http、web开发原则、xss漏洞的详细介绍

    1.Session 2.验证码 YZM.ashx 复制代码 代码如下: <%@ WebHandler Language="C#" Class="YZM" %> using System;using System.Web; public class YZM : IHttpHandler, System.Web.SessionState.IRequiresSessionState{ public void ProcessRequest (HttpContex

  • ASP.NET笔记之Calender的使用说明

    1.介绍 (1.在Calender中,所有可选择的符号会显示下划线,这是因为它们在浏览器都会呈现为链接. 如果让用户可以选择某天.月.周,必须设置SelectionMode属性(Day. DayWeek.DayWeekMonth) (2   控件事件  当用户选择了某一天或者月,可以用OnSelectionChanged来触发 通过  Calendar1.SelectedDate.ToShortDateString();来获取所选择的时间点     通过  Calendar1.SelectedD

  • ASP.NET笔记之文章发布管理小系统案例

    母版页:SiteFont.Master 复制代码 代码如下: <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteFont.master.cs" Inherits="协同企业管理系统.SiteFont" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/

随机推荐