一什么是应用程序设置 应用程序设置通常是指与应用程序密切相关的一系列参数在基于窗体的Windows应用程序中应用程序设置主要包括影响应用程序布局的位置尺寸等参数影响应用程序外观的颜色形状等参数此外还包括应用程序的语言文化等设置以及数据源和连接字符串等等这些参数设置在程序开发中应用广泛有的被用来保持应用程序的一致性连续性比如保存应用程序结束时的窗体大小位置及背景颜色下次执行应用程序时恢复这些设置另一些参数则使程序代码更加简洁高效比如保存数据库连接字符串供多次调用
与基于窗体的windows应用程序不完全相同基于web的Aspnet应用程序有其自身的特殊性它是面向网络的这决定了aspnet应用程序设置除包括上面的参数外还包括
◆身份验证和授权等安全机制
◆网络传输协议类型和针对特定类型文档的http处理程序
◆事务处理
◆为所有页面设置超时
◆定制出错页面来代替默认IIS出错页面
◆会话和会话状态信息
◆页面缓存行为
◆自定义及扩展
可见aspnet 应用程序设置参数类型更为丰富实际开发中它们不仅被用来提高应用程序安全性高效性而且易于对特定用户实施管理并可定制需求
二为什么要将aspnet应用程序设置外置为web服务
关于web服务的优点就不用再提了媒体铺天盖地的宣传和在许多领域的广泛应用已经足够说明问题不过这里仍然要强调的是web服务实际上就是aspnet应用程序只不过重新进行了组织特别地web服务为不同应用程序之间共享对象提供了实现通过简单的引用你可以在程序中访问另一程序实现的功能而不仅仅是aspnet中那样只有通过浏览器才能实现显而易见web服务也具有一般aspnet应用程序所拥有的许多功能和特性Aspnet和web服务都有状态管理功能就是一个典型的示例
然而将aspnet应用程序设置外置为web服务有什么优点呢?一方面可以从软件(应用程序)可复用性方面得到答案试想一想如果客户应用程序(源)需要使用另一应用程序(目标)的设置参数这时将目标应用程序设置配置为web服务在源应用程序中就能够方便地调用了就像在本机配置了同样的设置一样另一方面web服务(aspnet应用程序应用)特殊的存储其应用程序设置的机制(即下面将讲述的webconfig文件存储设置)使得应用程序跨平台跨internet以及应用程序的升级和xcopy部署方式成为可能
三存储aspnet应用程序设置
我们应该已经知道基于windows应用程序的设置一般保存在注册表中通过对注册表写入键值对保存特定相应的设置值然后通过读取注册表的键值对取出相应的设置值看来过程本身并不复杂加上Net框架为注册表的读写提供了丰富的类库支持使得操作注册表以读写应用程序设置更为简单(关于注册表读写请参见专门的文章这里就不展开了)
然而注册表本身是个相当敏感的区域对它的读写不可避免地引发安全隐患即便在本地主机上操作也要相当慎重更何况置身于不可预料用户数量的网络环境之下就更应该在公开注册表的读写操作时慎之又慎!或者干脆找别的方法替代!
正是由于这样的原因Aspnet应用程序设置除了存储在注册表中外更多地通过以下两种方式来存储
◆Application对象
◆Webconfig文件
四使用Application对象存储应用程序设置
对我们来说Application对象相当熟悉它是aspnet从asp中保留下来的用以简化应用程序状态管理的两个对象之一(另一个是Session对象)作为一个aspnet应用程序web服务就象其他任何web应用程序一样也能够访问application对象
在aspnet中application对象可视为高级语言中的全局变量它在应用程序中保持一致以实现 ASPNET 应用程序中多个会话和请求之间的全局信息共享(有必要提一下ASPNET 应用程序是单个 Web 服务器上的某个虚拟目录及其子目录范围内的所有文件页处理程序模块和代码的总和)
有别于普通全局变量的是aspnet应用程序状态Application对象在客户端第一次从某个特定的 ASPNET 应用程序虚拟目录中请求任何 URL 资源时创建Web 服务器上的每个 ASPNET 应用程序都要创建一个单独的实例然后通过此Application对象公开对每个实例的引用
这样application对象适宜被用来保存需要不同用户共享的数据记载关于应用程序的设置情况以使其能够被运行于同一个web应用程序中的所有代码访问进一步将包含application对象的方法外置为web服务以在应用程序中共享对象并操作应用程序设置值有关应用程序访问次数的状态编程读取远程数据库的互操作编程等都通过以此类似的方式来实现应用程序的设置共享
下面的代码使用application对象记载特定应用程序的访问次数并将方法外置为web服务供应用程序调用
[WebService(Namespace=http://wwwthjxcom)]
public class Application : SystemWebServicesWebService
{
/// <summary>
/// 返回应用程序被访问次数
/// </summary>
[WebMethod(Description=返回特定应用程序被访问的次数)]
public int GetAppAccessCount(string key)
{
if(Application[key]==null)
{
ApplicationLock();//锁定Application对象以同步访问
Application[key]=;
ApplicationUnLock();//取消锁定
}
else
{
ApplicationLock();
Application[key]=IntParse(Application[key]ToString())+;
ApplicationUnLock();
}
return (int)Application[key];
}
}
方法GetAppAccessCount(string key)在特定应用程序被执行一次后访问次数递增个单位量并保存在应用程序设置变量中下一次来自任何用户的访问将在这个变量的基础上递增该设置
五使用Webcongfig文件存储应用程序设置
从上面可以知道aspnet应用程序需要配置很多的特殊设置包括为所有页面设置超时定制出错页面来代替默认IIS出错页面以及安全设置和授权级别设置等看上去这么多类型的设置一定很麻烦幸运地是aspnet结束了需要进行手工配置的历史那就是将设置保存在Webconfig文件中这是不同于此前提到的使用注册表或application对象保存应用程序设置的另一种保存应用程序设置的方法由于webconfig文件存在于应用程序根目录下以这种方式保存的应用程序设置将使应用程序跨平台使用和伸缩性大大增强
使用webconfig文件存储应用程序设置有很多优点webconfig实际上是一个纯文本文件显然存储在纯文本文件中的配置信息非常容易修改而且不象传统的asp任何对配置设置的修改不需要重新启动web服务器就可以立即应用于当前的web应用程序同时设置好的配置被自动应用于当前文件夹和它所有的子文件夹使真正兼容主机的xcopy成为可能我们只需要复制另一个IIS虚拟目录中的所有web应用程序文件即可实现应用程序部署另外一些特定任务的配置如基于表单的授权只有通过使用webconfig文件才能实现
这里有必要简要说说webconfig文件的构造webconfig文件是标准的xml文件遵循格式正确的xml文档的所有规范它包括多个部分每一部分处理一个特殊的任务webconfig文件由许多小节组成包括验证小节安全性小节错误处理小节和web服务小节并以键值对的形式保存应用程序配置信息
作为标准的xml文档webconfig文件的根元素是<configuration>它包含一个子元素<systemweb>而后者又包括许多配置部分Webconfig文件包含许多标记每一个标记对应一个所谓的部分(section)如表示身份验证的Authentication表示授权的Authorization定制错误的CustomErrors会话设置SessionState等等
尽管webconfig文件为用户自定义提供了很大的空间我们可能仍然需要一些用户设置appSettings部分就是用来满足这项要求的请记住这部分并不在<systemweb ></systemweb>标记中而是单独存放在<configuration></configuration>标记中数据库连接字符串email服务器地址和日志文件存放路径通常页可以放在这部分
下面的代码片段是一个webconfig文件的设置小节该小节定义了应用程序设置即appSettings小节它包含了数据库连接字符串和另一个用户设置LogFilePath键值对
<configuration>
<appSettings>
<add key=Conn value=server=(local);uid=sa;pwd=;database=myDB />
<add key=logFilePath value=c:\mylogs />
</appSettings>
</configuration>
Net框架支持aspnet应用程序访问应用程序设置其ConfigurationSettings 类提供对指定配置小节中配置设置的访问该类的公共属性ConfigurationSettingsAppSettings 属性可获取 <appSettings> 元素配置节中的配置设置该属性是一个NameValueCollection它包含配置设置的名称/值对
public static NameValueCollectionAppSettings {get;}
下面的web服务方法用于获取应用程序配置设置using SystemConfiguration;
[WebMethod]
public string GetAppSetting(string key)
{
return ConfigurationSettingsAppSettings[key];
}
注意AppSetting属性是只读的要想修改应用程序设置必须编辑webconfig文件同时如果key键并不存在于webconfig文件中读取AppSettings属性将引发错误
ConfigurationSettings 类还提供了一个公共方法ConfigurationSettingsGetConfig 用于返回用户定义的配置节的配置设置
public static object GetConfig(string sectionName);
其中参数sectionName 表示要读取的配置节下面的web服务方法用于获取用户定义配置的指定键值
[WebMethod]
public string GetConfig(string key)
{
NameValueCollection nv=new NameValueCollection();
//实例化NameValueCollection 类对象
nv=(NameValueCollection)ConfigurationSettingsGetConfig(appSettings);
//返回用户定义的配置节的设置
return nv[key]ToString();
//返回特定键值
}
六消费实现aspnet应用程序设置的web服务
你可以编写 Web应用程序Windows桌面应用程序或Web服务等应用程序来消费已经创建的应用程序设置web服务实现方式同任何标准的web服务一样没有什么特别之处应该说很简单这里就不展开讲解了
七参考资料
◆《Professional Xml For Net Developers》
◆《Professional Aspnet Web Services》