什么是跨页投递?
• 在ASP.NET 1.x 中,Web 窗体自动回发给它们的宿主页。
即,当用户提交一个窗体时,窗体数据总是提交回包含该
原始窗体的页面。
• 在ASP.NET 2.0 中,Web 窗体控件有一个新特性,让开发
人员决定在进行提交操作时将窗体数据发送到何处。
如何实现跨页投递?
• 将实现IButtonControl 接口的控件配置为发送至不同的目
标页,例如:Button
System.Web.UI.WebControls.IButtonControl
{
string PostBackUrl;
event System.EventHandler Click;
}
如何从源页获取信息?
• 获取来自页上控件的信息(即由浏览器发送的信息)
– 通过Page. PreviousPage 属性获得源页的引用
– 默认情况下,PreviousPage 属性类型化为Page
– 获得源页的引用后,通常使用FindControl 方法来获取控件的信息
– 如果源页和目标页位于不同的应用程序中,则无法直接获取页上控件的值,但可以从Form 字典中读取发送的数据。
(Request.Form[“控件名”])
if (Page.PreviousPage != null)
{
TextBox SourceTextBox = (TextBox)Page.PreviousPage.FindControl("TextBox1");
if (SourceTextBox != null)
{
Label1.Text = SourceTextBox.Text;
}
}
如何从源页获取信息?
• FindControl 方法在当前的命名容器中查找控件。如果要查
找的控件位于另一控件内(通常位于模板内),则必须先
获取对该容器的引用,然后才能在该容器中查找要获取的
控件。
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
if (UserName != null)
{
Label1.Text = UserName.Text;
}
}
else
{
Label1.Text = "Cannot find user name in Login control.";
}
如何从源页获取信息?
• 获取源页的公共属性
– 在跨页发送的目标页中,也可以获取源页的公共成员的值。最常见的方案是源页定义公共属性,并且您要在目标页上获取这些属性的值。
– 若要获取源页的公共成员,必须先获取对源页的强类型引用。
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>
Label1.Text = PreviousPage.CurrentCity;
假如源页有一个公开的属性CurrentCity
Label1.Text = PreviousPage.CurrentCity;
如何从源页获取信息?
• 获取源页的公共属性
– 获取对源页的强类型引用的另一种方法是将PreviousPage 属性强
制转换为源页类型
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;
如果当前页不是跨页发送的目标,则PreviousPage 属性返回null
检查目标页中的回发
• 在跨页回发过程中,源页控件的内容被发送至目标页,并且浏览器执
行HTTP POST 操作(不是GET 操作)。
• 但在目标页中,在跨页发送之后,IsPostBack 属性仍然是false。尽
管该行为是POST 的行为,但跨页发送并不是到目标页的回发。
• 并且目标页可以通过它的第一次代码
• 如果要确定目标页是否由于跨页发送而正在运行。为此,您可以对目
标页的PreviousPage 属性返回的页引用的IsCrossPagePostBack 属性
进行测试
if(PreviousPagif(PreviousPage != null)
{
if(PreviousPage.IsCrossPagePostBack == true)
{
Label1.Text = "Cross-page post.";
}
}
else
{
Label1.Text = "Not a cross-page post.";
}
跨页发送与Server.Transfer
• 跨页发送这是一种基于客户端的传输
• Server.Transfer 方法是基于服务器的操作
• 两种操作中,目标页中的代码都可以使用PreviousPage 属性获取对源页的引用
• 通过PreviousPage.IsCrossPagePostBack 属性确定是跨页发送
什么是缓存?
• 通常,应用程序可以将那些频繁访问的数据,以及那些需
要大量处理时间来创建的数据存储在内存中,从而提高性
能。例如,如果应用程序使用复杂的逻辑来处理大量数
据,然后再将数据作为用户频繁访问的报表返回,避免在
用户每次请求数据时重新创建报表可以提高效率。
• ASP.NET 使用两种基本的缓存机制来提供缓存功能
– 页输出缓存:它保存页处理输出,并在用户再次请求该页时,重
用所保存的输出,而不是再次处理该页。
– 应用程序缓存:它允许您缓存所生成的数据,如DataSet 或自定
义报表业务对象
页输出缓存
• 什么是页输出缓存?
– 页输出缓存在内存中存储处理后的ASP.NET 页的内容。
这一机制允许ASP.NET 向客户端发送页响应,而不必
再次经过页处理生命周期。页输出缓存对于那些不经
常更改,但需要大量处理才能创建的页特别有用。例
如,如果创建大通信量的网页来显示不需要频繁更新
的数据,页输出缓存则可以极大地提高该页的性能。
– 提供了两种页缓存模型
• 整页缓存:允许将页的全部内容保存在内存中,并用于完成客
户端请求
• 部分页缓存:允许缓存页的部分内容,其他部分则为动态内容
如何实现页输出缓存?
• 以声明方式设置页的可缓存性
• 使用缓存配置文件以声明方式设置页的可缓存性

<%@ OutputCache Duration="60" VaryByParam="None" Location=“Any” %>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache30Seconds" duration="30"
varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<%@ OutputCache CacheProfile="Cache30Seconds" %>
如何实现页输出缓存?

• 以编程方式设置页的可缓存性
Response.Cache.SetCacheability(HttpCacheability.Public);
使用文件依赖项缓存页输出
• 有时候,您可能需要在文件发生更改时从输出缓存中移除某一页。例如,您可能有这样一页:该页从生成XML 文件作为输出且占用大量进程的报告中获取其内容。仅当XML 文件发生更改时,才需要重新处理该页。要将重新处理限制为仅在需要的时候进行,可以使页的缓存策略依赖于单个文件。如有必要,可以使缓存页依赖于多个文件。
protected void Page_Load(object sender, EventArgs e)
{
string fileDependencyPath = Server.MapPath("TextFile1.txt");
Response.AddFileDependency(fileDependencyPath);
// Set additional properties to enable caching.
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
}
protected void Page_Load(object sender, EventArgs e)
{
string[] fileDependencies;
string fileDependency1 = Server.MapPath("TextFile1.txt");
string fileDependency2 = Server.MapPath("XMLFile1.xml");
fileDependencies = new String[] { fileDependency1,
fileDependency2 };
Response.AddFileDependencies(fileDependencies);
}
缓存页的多个版本
• 使用请求的浏览器对页的各个版本进行缓存
• 使用参数对页的各个版本进行缓存
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="browser" %>
Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
Response.Cache.SetVaryByCustom("browser");
<%@ OutputCache Duration="60" VaryByParam="City" %>
Response.Cache.SetExpires(DateTime.Now.AddMinutes(1.0));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
Response.Cache.VaryByParams["Zip"] = true;
动态更新缓存页的部分
• 页面进行缓存可以大大提高Web 应用程序的性能。不过,在有些情况下,需要缓存页面的大部分内容,但页面中的某些片段是动态的。例如,如果创建一个页面,其中的新闻故事在设定时间段内完全是静态的,则可以设置为缓存整个页面。如果希望提供在每次页请求时都发生变化的交替出现的广告横幅,则该页中包含该广告的部分需要是动态的。
• 有三种方法可以实现缓存后替换
– 以声明方式使用Substitution 控件。
– 以编程方式使用Substitution 控件API。
– 以隐式方式使用AdRotator 控件。
<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDateTime" />
public static string GetCurrentDateTime(HttpContext context)
{
return DateTime.Now.ToString();
}
Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetCurrentDateTime));
什么是应用程序缓存?
• ASP.NET 为您提供了一个强大的、便于使用的缓存机制,
用于将需要大量服务器资源来创建的对象存储在内存中。
缓存这些类型的资源会大大改进应用程序的性能。
Cache["CacheItem1"] = "Cached Item 1";
Cache.Insert("CacheItem2", "Cached Item 2");
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3", new System.Web.Caching.CacheDependency(null, dependencies));
Cache.Insert("CacheItem4", "Cached Item 4", new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile1.xml")));
System.Web.Caching.CacheDependency dep1 = new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));
string[] keyDependencies2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dep2 = new System.Web.Caching.CacheDependency(null, keyDependencies2);
System.Web.Caching.AggregateCacheDependency aggDep = new System.Web.Caching.AggregateCacheDependency();
aggDep.Add(dep1);
aggDep.Add(dep2);
Cache.Insert("CacheItem5", "Cached Item 5", aggDep);
检索应用程序缓存
• 要从缓存中检索数据,应指定存储缓存项的键。不过,由于缓存中所存储的信息为易失信息,即该信息可能由ASP.NET 移除,因此建议的开发模式是首先确定该项是否在缓存中。如果不在,则应将它重新添加到缓存中,然后检索该项。
string cachedString;
if (Cache["CacheItem"] != null)
{
cachedString = (string)Cache["CacheItem"];
}
else
{
Cache.Insert("CacheItem", "Hello, World.");
cachedString = (string)Cache["CacheItem"];
}

使用SQL Server依赖的缓存
• 什么是SQL Server依赖的缓存?
– 可以创建一个名为ViewProduct.aspx 的页,用于显示有关特定产品的信息。可以将该页的缓存策略设置为SQL 依赖项,就如为手动添加到缓存中的项所设置的依赖项一样。该页便会一直存储在缓存中,直至所依赖的表或行发生更改为止。当数据发生更改时,便会重新创建页,并将新创建的页再次存储在输出缓存中。
• ASP.NET SQL 缓存依赖项提供以下功能:
– SQL 缓存依赖项可用于应用程序缓存和页输出缓存。
– 可在SQL Server 7.0 及更高版本中使用SQL 缓存依赖项。
– 可以在网络园(一台服务器上存在多个处理器)或网络场(多台服务器运行同一应用程序)中使用SQL 缓存依赖项。
– 与SQL 缓存依赖项关联的数据库操作比较简单,因此不会给服务器带来很高的处理成本。
– 在应用程序和SQL Server 中配置SQL 缓存依赖项不需要很精深的SQL 知识。ASP.NET 中包括可以自动执行此配置的工具。另外,还可以使用SqlCacheDependencyAdmin 类以编程方式配置SQL 缓存依赖项。
如何实现SQL Server依赖的缓存
• 为SQL Server 启用缓存通知
C:\WINDOWS\Microsoft.NET\Framework\v2.0.40217
aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d Northwind -et -t Employees

如何实现SQL Server依赖的缓存
• 为缓存功能配置网页
• 在Web.config 文件中设置缓存配置

<%@ OutputCache Duration="3600" SqlDependency="Northwind:Employees" VaryByParam="none" %>
<caching>
<sqlCacheDependency enabled = "true" pollTime = "1000" >
<databases>
<add name="Northwind"
connectionStringName="NorthwindConnectionString1"
pollTime = "1000"
/>
</databases>
</sqlCacheDependency>
</caching>
缓存清理
• 自动移除数据
– 由于服务器上的内存不足,开始一个称为“清理”的过程。
– 由于缓存中的项已过期。
– 由于项的依赖项发生了更改。
• 清理
– 清理是在内存不足时从缓存中删除项的过程。如果某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移除
• 过期
– 除了清理外,在缓存项过期时,ASP.NET 会自动从缓存中移除这些项
– 可调过期:指定某项自上次被访问后多长时间过期。例如,可以将某项设置为自上次在缓存中被访问后20 分钟过期。
– 绝对过期:指定某项在设定的时间过期,而不考虑访问频率。例如,可以将某项设置为在6:00 PM 过期,或四小时后过期。



posted on 2006-09-01 17:43  公木子  阅读(452)  评论(1)    收藏  举报