控件中国网提供大量WEB控件产品。本文将向您全面介绍在.NET框架4和Visual Studio 2010环境下进行ASP.NET 4 Web开发的新特征支持。具体来说,本系列文章将细分为核心服务篇、Microsoft Ajax Library新特征篇、Web表单篇、ASP.NET MVC篇、动态数据篇、Visual Studio 2010 Web设计器改进篇、使用Visual Studio 2010部署Web应用程序篇等。
ASP.NET 4中引入了许多改进核心ASP.NET服务的新特征,例如输出缓存和会话状态存储等,本文为系列的第一篇,将向您详细讨论核心ASP.NET服务方面的改进。
一、Web.config文件重构
Web.config文件包含了Web应用程序极其重要的配置信息,在过去几年推出的.NET框架中已经在多方面进行了巨大的改进。例如Ajax支持、路由控制以及与IIS 7的整合等一些新的功能被增加到这个文件中来。这种情况也导致了一个问题:当不使用像Visual Studio这样的工具时难以配置或启动一个新的Web应用程序。
在.NET框架4中,主要的配置元素已被转移到Machine.config文件中,现在应用程序可以从这些设置中进行继承。这使得ASP.NET 4中的Web.config文件或者为空或者只包含如下所示的几行信息(其中向Visual Studio指出应用程序将运行于哪个版本的.NET框架上)。
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
</configuration>
二、可扩展的输出缓存
自从ASP.NET 1.0发布以来,输出缓存使开发人员能够把由网页、控件及HTTP响应等生成的输出内容存储到内存中。这样一来,在后面的Web请求时,系统能够从内存检索这些生成的输出内容而不是从头开始重新生成输出,从而使ASP.NET可以更迅速地提供内容。但是,这种方法也有一个限制—生成的内容一定要存储在内存中。这样一来,服务器将承受巨大流量带来的压力,输出缓存消耗的内存与来自Web应用程序的其他部分的内存需求之间导致严重冲突。
针对上述情况,ASP.NET 4针对输出缓存增加了一个扩展点,能够使您可以配置一个或多个自定义输出缓存提供程序。输出缓存提供程序可以使用任何的存储机制来存储HTML内容。这使得开发者有可能针对不同的持久性机制创建自定义的输出缓存提供程序,其中可以包括本地或远程磁盘,云存储和分布式缓存引擎等等。
具体实现思路是,您可以通过从新的System.Web.Caching.OutputCacheProvider类中派生一个类来创建自定义输出缓存提供程序。然后,您可以通过使用OutputCache元素的新的providers节在Web.config文件中配置提供程序,如下面的示例所示:
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<add name="DiskCache"
type="Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider"/>
</providers>
</outputCache>
</caching>
默认情况下,在ASP.NET 4中,所有的HTTP响应、生成的网页以及控件都使用内存输出缓存,如前面的例子所示,其中defaultProvider属性被设置为AspNetInternalProvider。您可以更改一个Web应用程序中所使用的默认的输出缓存提供程序—这是通过为defaultProvider指定一个不同的提供程序名称实现的。
此外,您还可以针对每个控件和每个请求选择不同的输出缓存提供程序。为不同的Web用户控件选择不同的输出缓存提供程序的最简单的方法是,在一个网页或控件的指令中以声明方式使用新的ProviderName属性,如下面的示例所示:
<%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %>
为一个HTTP请求指定一个不同的输出缓存提供程序需要更多一点的工作。你不是使用声明方式来指定提供程序,而是在Global.asax文件中通过重载新的GetOuputCacheProviderName方法以编程方式指定针对一个具体的请求使用哪一个提供程序。下面的示例演示了如何做到这一点。
public override string GetOutputCacheProviderName(HttpContext context)
{
if (context.Request.Path.EndsWith("Advanced.aspx"))
return "DiskCache";
else
return base.GetOutputCacheProviderName(context);
}
随着在ASP.NET 4中增加输出缓存提供程序扩展,您现在可以为您的网站采取更积极和更智能化的输出缓存策略。例如,现在有可能把一个网站中的用户访问量占“前十名”的那些网页缓存到内存中,而把那些较低访问量的网页缓存到磁盘上。此外,您还可以针对一个呈现的页面缓存每一个VaryBy组合(译者注:请参考ASP.NET缓存技术中的VaryByParam参数相关用法)而使用分布式缓存,从而减轻前端Web服务器的内存消耗。
三、自启动的Web应用程序
某些Web应用程序在服务第一个请求之前需要加载大量的数据或执行昂贵的初始化处理。在ASP.NET的早期版本中,对这些情况,你必须制定定制办法来“唤醒”一个ASP.NET应用程序,然后在Global.asax文件的Application_Load方法中运行初始化代码。
现在,当ASP.NET 4运行在Windows Server 2008 R2的IIS 7.5服务器上时,你可以使用一种直接针对上述问题的命名为自动启动(auto-start)的新的可扩展性功能。这种自动启动功能提供了一种可控制的方法来启动一个应用程序池,初始化一个ASP.NET应用程序,然后接受HTTP请求。
这是一种突破性的更新!被称之为“IIS Application Warm-Up Module for IIS 7.5”(针对IIS 7.5的IIS应用程序热身模块):
IIS团队已经发布了这个模块的第一个beta测试版。这能够实现比以前更容易地为你的应用程序“热身”。在Web应用程序接受来自网络的请求之前,您可以指定执行的资源网址,而不是编写自定义代码。在IIS服务启动期间(如果您把IIS应用程序池配置为AlwaysRunning)和当一个IIS工作进程被回收时,即发生这种“热身”。在工作进程被回收期间,旧的IIS工作进程继续执行请求,直到新生成的辅助进程完全“热身”,这样一来,应用程序就不会感觉到发生中断及因未进行及时的缓存而出现的其他问题。注意,这个模块可以应用于从2.0版开始的任何版本的ASP.NET。
更多的有关信息,请参见《Application Warm-Up on the IIS.net Web site》。有关如何使用上述热身功能的实际演练,请参阅《Getting Started with the IIS 7.5 Application Warm-Up Module on the IIS.net Web site》。
要使用上述这种自启动功能,IIS管理员可以通过在applicationHost.config文件中使用下面的配置来在IIS 7.5中设置一个应用程序池:
<applicationPools>
<add name="MyApplicationPool" startMode="AlwaysRunning" />
</applicationPools>
因为一个应用程序池中可以包含多个应用程序,所以,您可以指定独立的应用程序可自动被启动—通过在applicationHost.config文件中设置如下的配置内容实现:
<sites>
<site name="MySite" id="1">
<application path="/"
serviceAutoStartEnabled="true"
serviceAutoStartProvider="PrewarmMyCache" >
<!-- Additional content -->
</application>
</site>
</sites>
<!-- Additional content -->
<serviceAutoStartProviders>
<add name="PrewarmMyCache"
type="MyNamespace.CustomInitialization, MyLibrary" />
</serviceAutoStartProviders>
当IIS 7.5服务器被冷启动或当个别应用程序池被回收时,IIS 7.5使用在applicationHost.config文件的信息来确定哪些Web应用程序需要自动启动。对于每个标记为自动启动的应用程序,IIS 7.5会发送一个请求到ASP.NET 4以便把应用程序启动到一个此程序暂时还不能够接受HTTP请求的状态。当应用程序处于这种状态时,ASP.NET会实例化由serviceAutoStartProvider属性定义的类型(如前面的例子所示),并调用到它的公共入口点处。
您可以通过实现IProcessHostPreloadClient接口并使用必需的入口点类型来创建一个托管的自动启动类型,如下面的示例所示:
public class CustomInitialization : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// Perform initialization.
}
}
在您的初始化代码在Preload方法中执行结束并返回后,ASP.NET应用程序已经为传入的处理请求作好了准备。
随着自启动功能添加到IIS 7.5和ASP.NET 4中,现在你在处理HTTP请求之前可以使用一个良好定义的方法来执行代价巨大的应用程序初始化工作。例如,您可以使用新的自动启动功能来初始化一个应用程序,然后向一个负载平衡器发出信号—应用程序已初始化完毕并准备接受HTTP请求了。
控件中国网提供大量WEB控件产品