视图状态
• ViewState属性提供一个字典对
象,用于在对同一页的多个请求之
间保留值。这是页用来在往返行程
之间保留页和控件属性值的默认方
法。
• 在处理页时,页和控件的当前状态
会散列为一个字符串,并在页中保
存为一个隐藏域或多个隐藏域(如
果存储在ViewState 属性中的数据
量超过了
MaxPageStateFieldLength 属性中
的指定值)。当将页回发到服务器
时,页会在页初始化阶段分析视图
状态字符串,并还原页中的属性信
息。
视图状态
• 使用视图状态的优点
– 不需要任何服务器资源视图状态包含在页代码内的结构中。
– 实现简单视图状态无需使用任何自定义编程。默认情况下对控
件启用状态数据的维护。
– 增强的安全功能视图状态中的值经过哈希计算和压缩,并且针
对Unicode 实现进行编码,其安全性要高于使用隐藏域。
• 使用视图状态的缺点
– 性能注意事项由于视图状态存储在页本身,因此如果存储较大
的值,用户显示页和发送页时的速度可能会减慢。尤其是对移动
设备,其带宽通常是有限的。
– 设备限制移动设备可能没有足够的内存容量来存储大量的视图
状态数据。
– 潜在的安全风险视图状态存储在页上的一个或多个隐藏域中。
虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接
查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性
问题。
控件状态
• 有时,为了让控件正常工作,您需要按顺序存储控件状态
数据。例如,如果编写了一个自定义控件,其中使用了不
同的选项卡来显示不同的信息。为了让自定义控件按预期
的方式工作,该控件需要知道在往返行程之间选择了哪个
选项卡。可以使用ViewState 属性来实现这一目的,不
过,开发人员可以在页级别关闭视图状态,从而使控件无
法正常工作。为了解决此问题,ASP.NET 页框架在
ASP.NET 中公开了一项名为控件状态的功能。
• ControlState 属性允许您保持特定于某个控件的属性信
息,且不能像ViewState 属性那样被关闭。
控件状态
• 使用控件状态的优点
– 不需要任何服务器资源默认情况下,控件状态存储在
页上的隐藏域中。
– 可靠性因为控件状态不像视图状态那样可以关闭,控
件状态是管理控件的状态的更可靠方法。
– 通用性可以编写自定义适配器来控制如何存储控件状
态数据和控件状态数据的存储位置。
• 使用控件状态的缺点
– 需要一些编程虽然ASP.NET 页框架为控件状态提供了
基础,但是控件状态是一个自定义的状态保持机制。
为了充分利用控件状态,您必须编写代码来保存和加
载控件状态。
隐藏域
• ASP.NET 允许您将信息存储在
HiddenField 控件中,此控件将
呈现为一个标准的HTML 隐藏
域。隐藏域在浏览器中不以可
见的形式呈现,但您可以就像
对待标准控件一样设置其属性。
当向服务器提交页时,隐藏域
的内容将在HTTP 窗体集合中随
同其他控件的值一起发送。隐
藏域可用作一个储存库,您可
以将希望直接存储在页中的任
何特定于页的信息放置到其中。
• 必须使用HTTP POST 命令提交
相应的页
隐藏域
• 使用隐藏域的优点
– 不需要任何服务器资源隐藏域在页上存储和读取。
– 广泛的支持几乎所有浏览器和客户端设备都支持具有隐藏域的窗体。
– 实现简单隐藏域是标准的HTML 控件,不需要复杂的编程逻辑。
• 使用隐藏域的缺点
– 潜在的安全风险隐藏域可以被篡改。如果直接查看页输出源,可以看到隐藏域中的
信息,这导致潜在的安全性问题。您可以手动加密和解密隐藏域的内容,但这需要
额外的编码和开销。
– 简单的存储结构隐藏域不支持复杂数据类型。隐藏域只提供一个字符串值域存放信
息。若要存储多个值,必须实现分隔的字符串以及用来分析那些字符串的代码。您
可以手动分别将复杂数据类型序列化为隐藏域以及将隐藏域反序列化为复杂数据类
型。但是,这需要额外的代码来实现。如果您需要将复杂数据类型存储在客户端
上,请考虑使用视图状态。视图状态内置了序列化,并且将数据存储在隐藏域中。
– 性能注意事项由于隐藏域存储在页本身,因此如果存储较大的值,用户显示页和发
送页时的速度可能会减慢。
– 存储限制如果隐藏域中的数据量过大,某些代理和防火墙将阻止对包含这些数据的
页的访问。因为最大数量会随所采用的防火墙和代理的不同而不同,较大的隐藏域
可能会出现偶发性问题。如果您需要存储大量的数据项,请考虑执行下列操作之一:
• 将每个项放置在单独的隐藏域中。
• 使用视图状态并打开视图状态分块,这样会自动将数据分割到多个隐藏域。
• 不将数据存储在客户端上,将数据保留在服务器上。向客户端发送的数据越多,您的应用
程序的表面响应时间越慢,因为浏览器需要下载或发送更多的数据。
Cookie
• Cookie 是一些少量的数据,这些数据或
者存储在客户端文件系统的文本文件
中,或者存储在客户端浏览器会话的内
存中。Cookie 包含特定于站点的信息,
这些信息是随页输出一起由服务器发送
到客户端的。Cookie 可以是临时的(具
有特定的过期时间和日期),也可以是
永久的。
• 可以使用Cookie 来存储有关特定客户
端、会话或应用程序的信息。Cookie 保
存在客户端设备上,当浏览器请求某页
时,客户端会将Cookie 中的信息连同
请求信息一起发送。服务器可以读取
Cookie 并提取它的值。一项常见的用途
是存储标记(可能已加密),以指示该
用户已经在您的应用程序中进行了身份
验证。
1.大多数浏览器支持最大为
4096 字节的Cookie
2.浏览器可以关闭Cookie的支持
Cookie
• 使用Cookie 的优点
– 可配置到期规则Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算
机上无限期存在,这取决于客户端的到期规则。
– 不需要任何服务器资源Cookie 存储在客户端并在发送后由服务器读取。
– 简单性Cookie 是一种基于文本的轻量结构,包含简单的键值对。
– 数据持久性虽然客户端计算机上Cookie 的持续时间取决于客户端上的Cookie
过期处理和用户干预,Cookie 通常是客户端上持续时间最长的数据保留形式。
• 使用Cookie 的缺点
– 大小受到限制大多数浏览器对Cookie 的大小有4096 字节的限制,尽管在当今
新的浏览器和客户端设备版本中,支持8192 字节的Cookie 大小已愈发常见。
– 用户配置为禁用有些用户禁用了浏览器或客户端设备接收Cookie 的能力,因此
限制了这一功能。
– 潜在的安全风险Cookie 可能会被篡改。用户可能会操纵其计算机上的Cookie,
这意味着会对安全性造成潜在风险或者导致依赖于Cookie 的应用程序失败。另
外,虽然Cookie 只能被将它们发送到客户端的域访问,历史上黑客已经发现从用
户计算机上的其他域访问Cookie 的方法。您可以手动加密和解密Cookie,但这
需要额外的编码,并且因为加密和解密需要耗费一定的时间而影响应用程序的性
能。
查询字符串
• 查询字符串是在页URL 的结尾附加的信息。
• 查询字符串提供了一种维护状态信息的方法,这种方法很
简单,但有使用上的限制。例如,利用查询字符串可以很
容易地将信息从一页传送到另一页。例如,将产品号从一
页传送到将处理该产品号的另一页。但是,大多数浏览器
和客户端设备会将URL 的最大长度限制为2083 个字符。
• 若要在页处理期间可以使用查询字符串的值,必须使用
HTTP GET 命令提交页。
查询字符串
• 使用查询字符串的优点
– 不需要任何服务器资源查询字符串包含在对特定URL 的HTTP 请
求中。
– 广泛的支持几乎所有的浏览器和客户端设备均支持使用查询字符
串传递值。
– 实现简单ASP.NET 完全支持查询字符串方法,其中包含了使用
HttpRequest 对象的Params 属性读取查询字符串的方法。
• 使用查询字符串的缺点
– 潜在的安全性风险用户可以通过浏览器用户界面直接看到查询字
符串中的信息。用户可将此URL 设置为书签或发送给别的用户,
从而通过此URL 传递查询字符串中的信息。如果您担心查询字符
串中的任何敏感数据,请考虑使用窗体(使用POST 而不是查询
字符串)中的隐藏域。
– 有限的容量有些浏览器和客户端设备对URL 的长度有2083 个
字符的限制。
基于客户端的状态管理的建议
• 视图状态
– 当您需要存储少量回发到自身的页信息时使用。使用ViewState 属性可提
供具有基本安全性的功能。
• 控件状态
– 当您需要在服务器的往返过程间存储少量控件状态信息时使用。
• 隐藏域
– 当您需要存储少量回发到自身或另一页的页信息时使用,也可以在不存
在安全性问题时使用。
– 注意:只能在提交到服务器的页上使用隐藏域。
• Cookie
– 当您需要在客户端存储少量信息以及不存在安全性问题时使用。
• 查询字符串
– 当您将少量信息从一页传输到另一页以及不存在安全性问题时使用。
– 注意:只有在请求同一页,或通过链接请求另一页时,才能使用查询字符
串。
基于服务器的状态管理
• ASP.NET 为您提供了多种方法,用于维护服务器
上的状态信息,而不是保持客户端上的信息。通
过基于服务器的状态管理,为了保留状态,您可
以减少发送给客户端的信息量,但它可能会使用
服务器上高成本的资源。

• 包括以下四种实现方式:
– 应用程序状态
– 会话状态
– 配置文件属性
– 数据库支持
应用程序状态
• ASP.NET 允许您使用应用程序
状态来保存每个活动的Web 应
用程序的值,应用程序状态是
HttpApplicationState 类的一个
实例。应用程序状态是一种全
局存储机制,可从Web 应用程
序中的所有页面访问。因此,
应用程序状态可用于存储需要
在服务器往返行程之间及页请
求之间维护的信息。
• 例如:如果你想计算网站的在
线人数,那么可以将这个计数
器变量保存在应用程序状态中。
应用程序状态
• 使用应用程序状态的优点
– 实现简单应用程序状态易于使用,为ASP 开发人员所熟悉,并
且与其他.NET Framework 类一致。
– 应用程序范围由于应用程序状态可供应用程序中的所有页来访问
• 使用应用程序状态的缺点
– 应用程序范围应用程序状态的范围可能也是一项缺点。在应用程
序状态中存储的变量仅对于该应用程序正在其中运行的特定进程
而言是全局的,并且每一应用程序进程可能具有不同的值。因
此,不能依赖应用程序状态来存储唯一值或更新Web 场和Web
园服务器配置中的全局计数器。
– 数据持续性有限因为在应用程序状态中存储的全局数据是易失
的,所以如果包含这些数据的Web 服务器进程被损坏(如因服务
器崩溃、升级或关闭而损坏),将丢失这些数据。
– 资源要求应用程序状态需要服务器内存,这可能会影响服务器的
性能以及应用程序的可伸缩性。
会话状态
• ASP.NET 允许您使用会话状态保存每个
活动的Web 应用程序会话的值,会话
状态是HttpSessionState 类的一个实例。
• 会话状态与应用程序状态相似,不同的
只是会话状态的范围限于当前的浏览器
会话。如果有不同的用户在使用您的应
用程序,则每个用户会话都将有一个不
同的会话状态。此外,如果同一用户在
退出后又返回到应用程序,第二个用户
会话的会话状态也会与第一个不同。
• 可以使用会话状态来完成以下任务:
– 唯一标识浏览器或客户端设备请求,并
将这些请求映射到服务器上的单独会话
实例。
– 在服务器上存储特定于会话的数据,以
用于同一个会话内的多个浏览器或客户
端设备请求。
– 引发适当的会话管理事件。此外,可以
利用这些事件编写应用程序代码。
会话状态
• 使用会话状态的优点
– 实现简单会话状态功能易于使用,为ASP 开发人员所熟悉,并且与其他.NET
Framework 类一致。
– 会话特定的事件会话管理事件可以由应用程序引发和使用。
– 数据持久性放置于会话状态变量中的数据可以经受得住Internet 信息服务(IIS) 重
新启动和辅助进程重新启动,而不丢失会话数据,这是因为这些数据存储在另一
个进程空间中。此外,会话状态数据可跨多进程保持(例如在Web 场或Web 园
中)。
– 平台可伸缩性会话状态可在多计算机和多进程配置中使用,因而优化了可伸缩性
方案。
– 无需Cookie 支持尽管会话状态最常见的用途是与Cookie 一起向Web 应用程序
提供用户标识功能,但会话状态可用于不支持HTTP Cookie 的浏览器。但是,使
用无Cookie 的会话状态需要将会话标识符放置在查询字符串中
– 可扩展性您可通过编写自己的会话状态提供程序自定义和扩展会话状态。然后可
以通过多种数据存储机制(例如数据库、XML 文件甚至Web 服务)将会话状态数
据以自定义数据格式存储。
• 使用会话状态的缺点
– 性能注意事项会话状态变量在被移除或替换前保留在内存中,因而可能降低服务
器性能。如果会话状态变量包含诸如大型数据集之类的信息块,则可能会因服务
器负荷的增加影响Web 服务器的性能。
配置文件属性
• ASP.NET 提供了一个称为配置文件属性的功能,可让您存储特定于用户的数
据。此功能与会话状态类似,不同的是,在用户的会话过期时,配置文件数
据不会丢失。配置文件属性功能使用ASP.NET 配置文件,此配置文件以持
久的格式存储,并与某个用户关联。
• 因为放置在配置文件属性中的数据没有存储到应用程序内存中,所以这些数
据在Internet 信息服务(IIS) 重新启动或辅助进程重新启动后仍能得到保
留,而不会丢失。此外,配置文件属性可以跨多个进程得到保持,例如在网
络场或网络园中。
配置文件属性
• 使用配置文件属性的优点
– 数据持久性放置在配置文件属性中的数据在IIS 和辅助进程重新启动过程中得
以保留而不会丢失数据,因为数据存储在一个外部机制中。此外,配置文件属性
可跨多进程保持(例如在Web 场或Web 园中)。
– 平台可伸缩性配置文件属性可在多计算机和多进程配置中使用,因而优化了可
伸缩性方案。
– 可扩展性为了使用配置文件属性,您必须对配置文件提供程序进行配置。
ASP.NET 提供了一个SqlProfileProvider 类,使您可以将配置文件数据存储在SQL
数据库中,但您也可以创建自己的配置文件提供程序类将配置文件数据按自定义
格式存储到自定义存储机制中,例如XML 文件甚至Web 服务。
• 使用配置文件属性的缺点
– 性能注意事项配置文件属性通常比使用会话状态慢,因为前者将数据持久保存
到数据存储设备而非内存中。
– 额外的配置要求与会话状态不同,配置文件属性功能需要使用相当数量的配置。
若要使用配置文件属性,您不仅要对配置文件提供程序进行配置,还要预先配置
您想要存储的所有配置文件属性。
– 数据维护配置文件属性需要一定的维护。因为配置文件数据持久保存到存储设
备中,所以必须确保在数据陈旧时,应用程序调用由配置文件提供程序提供的相
应清理机制。
数据库支持
• 在某些情况中,您可能希望使用数据库支
持来维护网站上的状态。通常,数据库支
持与Cookie 或会话状态结合在一起使用。
• 例如,对于电子商务网站,普遍使用关系
数据库维护状态信息,其原因是:
– 安全性
– 个性化
– 一致性
– 数据挖掘
数据库支持
• 使用数据库维护状态的优点
– 安全性访问数据库需要严格的身份验证和授权。
– 存储容量可以根据需要在数据库中存储尽可能多的信息。
– 数据持久性可以根据需要在尽可能长的时间内存储数据库信息,这些信
息不受Web 服务器可用性的影响。
– 可靠性和数据完整性数据库包括多种用于维护有效数据的功能,其中包
括触发器和引用完整性、事务等。通过在数据库中(而不是在会话状态
等对象中)保存有关事务的信息,可以更为方便地从错误恢复。
– 可访问性存储在数据库中的数据可供众多的信息处理工具访问。
– 广泛的支持有大量数据库工具可供使用,并且有许多自定义配置可供使
用。
• 使用数据库维护状态的缺点
– 复杂性使用数据库支持状态管理需要更复杂的硬件和软件配置。
– 性能注意事项不佳的关系数据模型结构可能导致可伸缩性问题。此外,
对数据库执行过多的查询可能会影响服务器性能。
基于服务器的状态管理的建议
• 应用程序状态
– 可在以下情况下使用:存储由多个用户使用且更改不频繁的全局信息,
而且不存在安全性问题。不要在应用程序状态中存储大量的信息。
• 会话状态
– 可在以下情况下使用:存储特定于单独会话的短期信息,并且需要较高
的安全性。不要在会话状态中存储大量的信息。需要注意,将为应用程
序中每一会话的生存期创建并维护会话状态对象。在支持许多用户的应
用程序中,这可能会占用大量服务器资源并影响可缩放性。
• 配置文件属性
– 可在以下情况下使用:存储需要在用户会话过期后保留、并在对应用程
序的后续访问中需要再次检索的特定于用户的信息。
• 数据库支持
– 可在以下情况下使用:存储大量信息,管理交易,或者信息必须可以经
受得住应用程序和会话重新启动。数据挖掘十分重要,并且需要较高的
安全性。
ASP.NET 2.0状态管理的新增功能
• 控件状态
– 为了让控件正常工作,有时需要存储控件状态数据。例如,如果
编写了一个自定义控件,其中具有显示不同信息的不同选项卡,
为使该控件如预期一样工作,控件需要知道在往返过程中选择的
是哪个选项卡。ViewState 属性可用于此目的,但开发人员可能在
页级别关闭了视图状态,从而有效地中断控件。为解决此问题,
ASP.NET 页框架在ASP.NET 2.0 版中公开了一种称为控件状态的
新功能。
– ControlState 属性允许保持特定于控件的属性信息,不像
ViewState 属性一样可以关闭。若要使用控件状态,控件必须在初
始化过程中调用RegisterRequiresControlState 方法,然后重写
SaveControlState 和LoadControlState 方法。
• 视图状态分块
– 图状态提供了一种简单的方法来自动保持页上的字段和控件数
据,而不需要在往返服务器期间手动请求并重新填充。它还允许
在ViewState 属性中存储页上的自定义数据。
– 但是,在某些情况下,视图状态数据会变得很大。因为视图数据
存储在隐藏的字段中,某些代理或防火墙会阻止对包含这些数据
的页的访问。因此,ASP.NET 2.0 页框架引入了一种名为视图状态
分块的功能。如果视图状态的数据量变得太大,视图状态分块自
动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段
中。
– 若要启用视图状态分块,请将MaxPageStateFieldLength 属性设
置为在单个视图状态字段中允许的最大大小(以字节为单位)。
当该页回发到服务器时,该页会在页初始化阶段分析视图状态字
符串,并还原页中的属性信息。默认设置是-1,这表示不存在最
大大小,不会将视图状态分成多个块区。
Q:web.config 中可以对 SQL Server 口令进行配置,出于安全考虑,有什么最佳实践来对口令进行加密?
A:1.可以使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 加密或解密 Web 配置文件的各节。在处理 Web.config 文件时,ASP.NET 将自动解密已加密的配置元素。(Aspnet_regiis.exe 工具位于 %windows%\Microsoft.NET\Framework\versionNumber 文件夹中。)
2.可以使用编程的方式处理节密:System.Configuration.SectionInformation.ProtectSection方法。
<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in  
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    
<configSections>
        
<section name="MSDNConfiguration" type="MyConfigSectionHandler.MSDNConfig, MyConfigSectionHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere"/>
    
<section name="myCustomSection" type="MyConfigSectionHandler.MyHandler, MyConfigSectionHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true"  allowDefinition="Everywhere" />
  
</configSections>
  
    
<MSDNConfiguration>
        
<add key="Ext_SvrName" value="Ben\SQL2005"/>
        
<add key="Ext_DBName" value="aspnetdb"/>
        
<add key="Ext_UID" value="sa"/>
        
<add key="Ext_Pwd" value=""/>
    
</MSDNConfiguration>
  
<myCustomSection myAttrib1="Clowns">
    
<myChildSection myChildAttrib1="Zippytest" myChildAttrib2="Michael Zawondy test "/>
  
</myCustomSection>

  
<appSettings>
    
<add key="myapp" value="myvalue"/>
  
</appSettings>
    
<connectionStrings>
  
<add name="AdventureWorksConnectionString" connectionString="Data Source=BEN\SQL2005;Initial Catalog=AdventureWorks;User ID=sa"
   providerName
="System.Data.SqlClient" />
  
<add name="LocalSqlServer" connectionString="Data Source=BEN\SQL2005;Initial Catalog=aspnetdb;User ID=sa"
   providerName
="System.Data.SqlClient" />
 
</connectionStrings>
  
  
<system.web>
        
<!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        
-->
        
<compilation debug="true"/>
        
<!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        
-->
        
<authentication mode="Windows"/>
        
<!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        
-->
    
</system.web>
  
  
<location path="SubFolder1" allowOverride="true">
    
<system.web>
      
<authorization>
        
<deny users="*"/>
      
</authorization>
    
</system.web>    
  
</location>
  
<location path="SubFolder1/Default.aspx">
    
<system.web>
      
<authorization>
        
<allow users="*"/>
      
</authorization>
    
</system.web>
  
</location>
</configuration>
protected void Button1_Click(object sender, EventArgs e)
    
{
        
string configPath = "/VS2005Demo8";

        Configuration config 
= WebConfigurationManager.OpenWebConfiguration(configPath);

        CompilationSection section 
= (CompilationSection)config.GetSection("system.web/compilation");

        StringBuilder compilation 
= new StringBuilder();
        compilation.Append(
"debug: ");
        compilation.Append(section.Debug.ToString());

        
this.Label1.Text = compilation.ToString();

    }

protected void Button1_Click(object sender, EventArgs e)
    
{
        
this.Label1.Text = WebConfigurationManager.AppSettings["myApp"].ToString();
        WebConfigurationManager.AppSettings[
"myApp"= "das";

        
this.Label1.Text += "<BR><BR>" + WebConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ToString();
    }

protected void Button1_Click(object sender, EventArgs e)
    
{
        MyConfigSectionHandler.MyHandler config 
=
    (MyConfigSectionHandler.MyHandler)System.Configuration.ConfigurationManager.GetSection(
    
"myCustomSection");

        StringBuilder sb 
= new StringBuilder();

        sb.Append(
"<h2>Attributes in the myCustomSection Element:</h2>");
        sb.AppendFormat(
"myAttrib1 = {0}<br/>", config.MyAttrib1.ToString());
        sb.Append(
"<h2>Attributes in the myChildSection Element:</h2>");
        sb.AppendFormat(
"myChildAttrib1 = {0}<br/>", config.MyChildSection.MyChildAttribute1.ToString());
        sb.AppendFormat(
"myChildAttrib2 = {0}<br/>", config.MyChildSection.MyChildAttribute2.ToString());

        Label1.Text 
= sb.ToString();
        Label1.Visible 
= true;

    }

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Configuration;

public partial class WebConfigurationManagerTest : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }

    
protected void Button1_Click(object sender, EventArgs e)
    
{
        Configuration config 
= WebConfigurationManager.OpenWebConfiguration("/VS2005Demo8");
        config.SaveAs(
"c:\\MyApp.web.config", ConfigurationSaveMode.Full, true);

    }

}
posted on 2006-11-25 14:18  公木子  阅读(222)  评论(0)    收藏  举报