一问题的提出 最终用户的每次请求都将读取Mapping文件——可以通过缓存解决 xxx子系统需要不断的写入Mapping文件——也可以先写入内存然后批量写入文件解决 二分析解决问题 由于分别有个或更多子系统需要对同一文件进行读写操作而客户端又有很大的并发性所以极可能出现读写沖突或错误也必将影响系统的性能 通过调用共同的进程外组件的方式来读写文件而这个共同的进程外组件只有在自身启动的时候把文件内容load到内存当文件有变化时更新内存 三COM+组件介绍 早在window发布时就已经产生了COM+并集成在操作系统中在运行的时候是以服务的形式存在的COM+增加了一系列的MTS(一种系统服务用于管理数据库中的持久性数据也处理在事务中的持久性消息队列和文件系统)服务 事务服务它确保了在分布式系统中的数据完整性 安全服务它的安全模型提供了处理安全性而不用编写任何代码的方法 同步服务提供了有管理地解决组件中并发问题的方法但却不用编写代码 资源管理(包括资源管理器和资源分配器)管理数据库连接网络连接和内存等 JIT激活即(Just In Time)是从MTS继承下来的一项服务当客户调用时才将该对象的一个实例保持为活跃状态并缓存在服务器内存中使用完对象后会通知MTS环境可以释放该对象所占用的资源了如数据库连接 对象池提供一个线程池来存放现成的对象以供下次再用是系统的一项自动服务当有应用程序访问COM+组件时即为应用程序创建该组件的一个实例并存放在对象池中应用程序关闭后即销毁实例可以自由配置组件使它的实例在池中的状态实现了实例的重用性提高应用程序的性能和伸缩性 基于角色的安全这个容易理解即验证角色给予安全许可给不同的用户予不同的权限 队列组件(MSMQ)提供异步消息队列可以自动按其形式将数据转换成数据包 共享属性管理器(SPM)用来管理存储在内存中的对象状态信息在一个服务器进程内可以用来共享多个对象间的状态并提供并发处理 补偿资源管理器(CRM)用于在处理事务期间生成日志文件并可处理系统崩溃包括CRM工作器(是CRM的主要部分通过CRM的基础设施提供的接口将事务的相关信息写入日志并在需要时检索日志文件)和CRM补偿器(用于在事务完成后将事务和生成的日志文件提交给执行事务的用户) 并发即允许一个应用程序中的多个进程同时运行进程被分成各组上下文(有相同需求的对象集合)包含在单元(一个进程内的一组上下文)中一个进程可包含多个上下文都涉及到不同的需求的对象而且每个上下文都有一个唯一的COM对象来提供COM+事务处理和JIT激活等服务利用COM+提供的工具可以创建执行交易的多层应用程序还可以处理线程分配的问题OK介绍完COM+的功能下面再介绍COM+的类型 COM+有几种不同用途的类型 1应用程序代理包含应用程序注册信息的文件即当有客户访问远程计算机的服务器程序时运行在客户端的应用程序代理就会将服务器应用程序的信息写入客户端器计算机中 2服务器应用程序即在COM+应用程序本身的进程内执行COM+应用程序同时使用并发性来处理组件 3库应用程序是在客户应用程序的进程内执行的装载在客户应用程序进程内的使用基于任务的安全性缺点是不支持远程访问和队列组件 4COM+预安装应用程序到管理工具中的组件服务中的COM+应用程序文件夹中查看就明白什么是COM+预安装应用程序了它是在COM+安装过程中自动安装进组件服务的应用程序不能修改也不能删除 同时涉及到一个叫程序集(Assembly )的概念它是CLR所有类型和其它资源(如位图文件等)的集合可通过管理工具下的配置NET框架来查看包括有私有和共享的程序集私有程序集它只能被放在与该程序集相同路径的应用程序访问默认为私有必须放在使用它的应用程序的文件夹中共享程序集指添加在GAC(Global Assembly Cache)中的程序集GAC是专门用来存放程序集中使应用程序可以共享这些程序集有一点必须注意就是存放在GAC中的程序集必须有一个唯一的名字可以通过在NET命令执行窗口中打入sn k assemblynamesnk 来生成一个唯一的名称叫做强名称生成强名称后会有一个公钥附加在此程序集上用于阻止名字相似而被代替的危险 NET中对程序集的安全性提供了两种机制一种是前面提到的强名称一种是使用Signcode(可理解为数字签名)Signcodeexe用来标记一个程序集同时嵌入一个数字签名到程序集中可以让用户识别创建此程序集的开发者 (注在GAC中不能有两个相同名称的强名称否则就不叫强名称了但可以存储一个程序集的多个拷贝而且在GAC中的程序集只能被拥有一定权限的用户删除) 关于程序集的版本号每一个版本都有一个位的版本号表示为四部分Major(为主版本号项目有变化时即改变)Minor(添加一个功能到项目时改变)BuildRevision(后两个是自动更新的)这些版本信息可以通过在应用程序中的AssemblyInfocs文件来查看 又是一堆的理论下面介绍COM+的应用在NET中使用COM+服务的组件就叫做NET服务组件跟一般的组件不同区别在于前者使用了COM+服务使用NET服务组件的目的也就是为了可以访问COM+服务的一些基类如ServicedComponent和自动事务处理JIT对象池和安全性方面等 在使用NET服务组件之前都必须注册服务组件有三种方式 1手动注册通过RegSvcsexe命令行工具来注册如Regsvcs yourcomponentdll 之后将产生一个yourcomponenttlb类型库包含了对象的类型信息(注意在使用该命令前必须先注册一个yourcomponent的强名称) 2编程注册使用RegistrationHelper类主要是利用在IregistrationHelper接口中的方法 3动态注册是指在执行应用程序过程中检查安装组件的版本如组件的正确版本没安装则在运行时自动安装需要的版本即自动注册(注调用自动注册的用户必须是Window Administrative组的一个成员因为动态注册无法改变COM+ 目录否则注册过程失败) 四实例剖析 首先新建一个类库(在我的项目里叫XMLOperate) 它会生成两个文件AssemblyInfocs和Classcs(我把Classcs改成了Maincs具体名称可以自己定) 添加引用(SystemEnterpriseServices ) 回到Maincs using System using SystemReflection using SystemRuntimeInteropServices using SystemEnterpriseServices namespace XMLOperator { /// <summary> /// OMPmSAXMLOperator 的摘要说明 /// </summary> [ObjectPooling(MinPoolSize= MaxPoolSize=)] [JustInTimeActivation(true)] [ClassInterface(ClassInterfaceTypeAutoDual)] public class XMLOperate ServicedComponent { protected override void Construct(string constructString) { baseConstruct(null) } protected override void Activate(){} protected override void Deactivate(){} protected override bool CanBePooled(){return true} protected override void Dispose(bool disposing) { baseDispose(disposing) } /// ///把我的很多方法都去掉了写个简单的visit来演示一下就OK了 /// [AutoComplete] public string visit(string name) { return 欢迎 + name } } } 回到AssemblyInfocs添加引用using SystemEnterpriseServices 添加代码 //将组件设置为服务器启动模式 [assembly ApplicationActivation(ActivationOptionServer) ] //制定应用服务器名称 [assembly ApplicationName(XMLOperate)] 接下来给服务器程序一个强名称(相当于注册)打开 Visual Studio Net (也许你用的是)命令提示找到文件的地址输入sn k 生成密匙比如我的文件在D盘work中 D\work\XMLOperate> sn k XMLOperatesnk XMLOperatesnk为生成的文件名称( 执行完成后文件里会多出一个文件serversnk ) 强名称生成完后回到程序中在AssemblyInfocs中最后几排可以发现[assembly AssemblyKeyFile( )]把文件路径写进去[assembly AssemblyKeyFile(……/……/XMLOperatesnk)] 生成解决方案在OBJ \ debug 中会有个XMLOperatedll回到Visual Studio Net 命令提示到文件obj\debug目录下执行regsvcs 命令注册服务(完全可以不用手工注册在步骤中客户端调用new的时候的时候如果没有注册该组件服务则系统会自动注册详细请见(三)部分最后的注册方式) 我的项目中是这样的 D\work\XMLOperate\obj\debug > regsvcs XMLOperatedll 这样服务器就构建完成 打开我的电脑控制面板管理工具组件服务com+应用程序现在我们可以看到com+中多了个XMLOperate这个就是刚所建的服务器 在XMLOperate上按右键打开属性修改安全性调用身份验证级别为无模拟级别为标识授权下的勾去掉( 这些是根据情况需要更改的现在仅仅做个本机上的列子)然后找到激活远程服务器名称改成你自己机器的IP地址 建立客户端 建一个winfrom(在我的项目里其实有个web service和一个window service来调用XMLOperate) 加入引用 using SystemEnterpriseServices using XMLOperate 在客户端要引用的地方new 一下就可以直接用其中的方法了 |