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