关于ASP.NET中的缓存问题的几种方式
1)缓存 ASP.NET 页
1以编程方式操作 HttpCachePolicy 类。
HttpCachePolicy.SetExpires
HttpCachePolicy.SetCacheability
|NoCache
|Private
|Public
|Server
|ServerAndNoCache
|ServerAndPrivate
2<%@
OutputCache Duration="60" VaryByParam="None" %>Duration 和 VaryByParam
属性是必需的。
2)缓存 ASP.NET
页的某些部分
不变的部分缓存起来,不必总是请求服务器
控件头部,则该控件的一个版本将在输出缓存中存储 120 秒。
<%@
OutputCache Duration="120" VaryByParam="None"
%>
或使用代码隐藏开发方法开发用户控件,则将以下属性包含在类声明的元数据中时,控件版本将在输出缓存中存储 120
秒。
[C#]
[PartialCaching(120)]
以上两法将仅缓存用户控件。
也可嵌套使用,在已缓存的页面或控件中缓存控件。
您可以在已为输出缓存指定的用户控件标记中声明
ID
属性,从而可以针对该用户控件的实例进行编程。但是,为了使代码正常工作,您必须显式验证该用户控件在输出缓存中存在。
!!可能的错误:
如果编写代码来操作一个包含
@ OutputCache 指令的用户控件,则将出现错误。
另外,如果页输出缓存设置为 100 秒,而用户控件输出缓存设置为 50
秒,则整个页将在输出缓存中存储 100
秒,而与用户控件较短的时间设置无关。
不过,如果页输出缓存存储持续时间比用户控件存储持续时间短,则将一直使用缓存用户输出控件,直到其存储时间到期为止,即使该页的其余部分已为某个请求重新生成。例如,如果页输出缓存设置为
50 秒,而用户控件输出缓存设置为 100
秒,则页的其余部分每到期两次,用户控件就到期一次。
3)缓存应用程序数据
允许您将需要大量的服务器资源来创建的对象存储在内存中。它是由
Cache 类实现的,实例是每个应用程序专用的,其生存期依赖于该应用程序的生存期。重新启动应用程序后,将重新创建 Cache
执行时间
计算页面执行时间
private DateTime startTime,endTime;
private TimeSpan ts;
private void Page_Load(object sender, System.EventArgs e)
{
//
在此处放置用户代码以初始化页面
startTime = DateTime.Now;
}
private void
Page_Unload(object sender, System.EventArgs e)
{
endTime = DateTime.Now;
ts = endTime - startTime;
HttpContext.Current.Response.Write("页面执行时间:"+ts.Milliseconds+"毫秒");
}
什么是ajax
术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验。在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步。Ajax提供与服务器异步通信的能力,从而使用户从请求/响应的循环中解脱出来。借助于Ajax,可以在用户单击按钮时,使用JavaScript和DHTML立即更新UI,并向服务器发出异步请求,以执行更新或查询数据库。当请求返回时,就可以使用JavaScript和CSS来相应地更新UI,而不是刷新整个页面。最重要的是,用户甚至不知道浏览器正在与服务器通信:Web站点看起来是即时响应的。
虽然Ajax所需的基础架构已经出现了一段时间,但直到最近异步请求的真正威力才得到利用。能够拥有一个响应极其灵敏的Web站点确实激动人心,因为它最终允许开发人员和设计人员使用标准的HTML/CSS/JavaScript堆栈创建“桌面风格的(desktop-like)”可用性。
通常,在J2EE中,开发人员过于关注服务和持久性层的开发,以至于用户界面的可用性已经落后。在一个典型的J2EE开发周期中,常常会听到这样的话,“我们没有可投入UI的时间”或“不能用HTML实现”。但是,以下Web站点证明,这些理由再也站不住脚了:
BackPack
Google Suggest
Google Maps
PalmSphere
所有这些Web站点都告诉我们,Web应用程序不必完全依赖于从服务器重新载入页面来向用户呈现更改。一切似乎就在瞬间发生。简而言之,在涉及到用户界面的响应灵敏度时,基准设得更高了。
定义Ajax
Adaptive Path公司的Jesse James Garrett这样定义Ajax:
Ajax不是一种技术。实际上,它由几种蓬勃发展的技术以新的强大方式组合而成。Ajax包含:
基于CSS标准的表示;
使用Document Object Model进行动态显示和交互;
使用XMLHttpRequest与服务器进行异步通信;
使用JavaScript绑定一切。
这非常好,但为什么要以Ajax命名呢?其实术语Ajax是由Jesse James Garrett创造的,他说它是“Asynchronous JavaScript + XML的简写”。
Ajax的工作原理
Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
1 AJAX还是AJAH
* AJAX的很多经典应用其实都是利用xmlhttp空间访问后台程序,后台程序返回脚本用eval回调或者返回简单数据的方式来开发。这样的开发模式的好处是设计简单轻巧,对熟悉dhtml的开发者来说上手会比较块,跨浏览器问题也容易解决,做简单的应用也够用。gmail,google suggest都是用这种方式。但是在我看来gmail已经吧AJAH应用到极限了,更复杂的数据结构用简单数据和回调方式来组织就开始有点力不从心了。
* 前AJAX的一种传统做法是后台返回完整的xml文件后用脚本(利用控件)解析xml后操作页面的dom节点来动态生成页面的一部分。这样作的优点是可以充分利用xml的强大表达能力传输各种数据结构,缺点是页面的dom操作效率不高,而且IE在dom操作的API上bug多多。之所以叫“前AJAX”,因为我们在AJAX这个名词出现前已经这样做了很多年了。
* AJAX另一种传统做法是后台返回完整的xml文件后用脚本(利用控件)解析xml后生成html代码再灌回页面的层中。这样的做法回避了页面dom操作的一些问题,在生成的内容比较多的时候利用一些字符串计算的优化技巧(主要是数组和正则的应用)可以相当高效的生成页面。在我看来这是未来的发展趋势。
我现在的项目主要采用的是第三种方式,结合第二种。我使用的是自己的一个小巧的框架,模拟jsp的语法来生成html代码,但是依赖于浏览器的xml解析API,因此难以跨浏览器。google的开源项目ajaxslt提供了一个纯js的xslt解决方式,功能更强大,可以在页面中局部的应用xslt解析xml生成html或者其他形式的数据,但是带来了xslt这个技术门槛。sf上的ZK似乎也不错,但是带来的是xul这个技术门槛,同时后台被绑定在了J2EE服务器上面。
2 CACHE
如果使用xmlhttp控件,在发起http请求的时候IE会包办cache策略,很多时候更新了数据却无法获得更新后的数据。一开始试图用传统方式在URL后面加随机数来强制更新,但是IE仍然距不发出新的请求。
一个解决方法是在后台写expires: 0或者其他的禁止前台cache的头,但是这样在数据没有更新的时候又会带来不必要的服务器压力、响应延迟和带宽浪费。
一个稍微好一点的解决方法是,前台在提交数据以后,需要强制更新数据的时候:
xmlhttp.setRequestHeader("If-Modified-Since","0");
3 系统错误: -1072896748。
用xmlhttp接收到数据的时候经常是用xmldom.loadXML(xmlhttp.responseXML.xml)来判断返回的数据的正确性,但是如果后台送过来不正确的xml的时候有时回触发-1072896748系统错误。这是因为xmlhttp.responseXML已经没有解析到东西了,我们还试图访问它的xml属性而触发的。
解决的方法是在使用responseXML.xml 或者 responseText的时候要做try/catch:
try{var tmp = xmlhttp.responseXML.xml}catch(ex){err=true;}
有些人喜欢catch的时候判断 exception.description=="系统错误: -1072896748。" , 如果客户端不是简体中文版的系统的时候就判断不到了。其实这个地方只要有异常,都必须走异常处理流程了,不用区分的那么仔细。
程序数据连接
在名为webdb.mdb的数据库中,有数据库表studentTable,其中有三个字段,字段id为自动编号,studentno为学号,studentname为学生姓名,请编写一个ASP程序,将这个表的数据库记录内容在网页上显示出来。
web.config
<connectionStrings><add name="SQLConnString" connectionString="Data Source=.;User ID=sa;Password=123;Initial Catalog=WXJBL_Product;" providerName="System.Data.SqlClient"/>
</connectionStrings>
页面
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<%#Eval("id")%><%#Eval("studentno")%><%#Eval("studentname")%>
</ItemTemplate>
</asp:Repeater>
cs文件
string connectionString = ConfigurationManager.ConnectionStrings["SQLConnString"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString);
string sql="select * from studentTable";
DataSet ds = new DataSet();
connection.Open();
SqlDataAdapter command = new SqlDataAdapter(sql, connection);
command.Fill(ds, "ds");
Repeater1.DataSource = ds;
Repeater1.DataBind();
<%@Page%>中的Codebehind、Autoevenwirentwireup有何作用
Codebehind 属性并不是一个真正的 ASP.NET 属性,在ASP.NET 文档中是找不到它的。它其实只是一个 Visual
Studio .NET 属性,Visual Studio
.NET 就是借用这个属性来很好地跟踪管理项目中的 Web 窗体和与之相对的代码隐藏文件,比如当你在设计环境中往 Web 窗体上放入一个服务器控件时,Visual Studio .NET 将自动找到与该 Web 窗体相对应的代码隐藏文件,并自动插入相关的代码。因此,用
Visual Studio .NET 作开发时,不可轻率地将 Codebehind 属性换成 Src
属性,他们的功能作用不同。指示该页的事件是否为自动连网的。如果启用事件自动连网,则为 true;否则,为 false。默认值为 true。有关更多信息,
请参阅 Web 服务器控件事件模型。 ASP.NET 页框架还支持以一种自动的方式将页事件与方法相关联。如果 Page 指令的 AutoEventWireup 属性设置为 true(或者如果缺少此属性,因为它默认为 true),该页框架将自动调用页事件,即 Page_Init 和 Page_Load 方法。在这种情况下,不需要任何显式的 Handles 子句或委托。 AutoEventWireup 属性的缺点是它要求页事件处理
程序具有特定、可预测的名称。这限制了您在为事件处理程序命名时的灵活性。 如果将AutoEventWireup属性设置为True,则VS会产生代码来绑定事件,而且网页架构会自动根据事件的名称来调用事件,这可能会导致网页运行时相同的事件代码被调用2次Inherits 属性用于定义当前 Web 窗体所继承的代码隐藏类(该类是 System.Web.UI.Page 的派生类)。这个 inherits 属性只用于采用代码隐藏方式编写的 Web 窗体,也就是,如果你的代码全都是在 Web 窗体的Inherits 属性用于定义当前 Web 窗体所继承的代码隐藏类(该类是 System.Web.UI.Page 的派生类)。这个 inherits 属性只用于采用代码隐藏方式编写的 Web 窗体。