.NETRemotingServer性能分析及利用Loadrunner进行性能测试的方案1概述|,jOnGf.NETRemoting被誉为管理应用程序域之间的RPC的首选技术。应用程序域是公共语言运行库的隔离单元,它们是在进程内创建并运行的。这与CLR和非CLR托管的进程之间的进程间通信(互操作)不同。后一种类型的RPC通信(特别是Web上的)一般被认为是Web服务领域的问题。遗憾的是,这种看似清楚的区分,却由于可以在IIS下集成.NetRemoting服务器而变得模糊,“通过在IIS中集成.NETRemoting对象,可以将其作为一种Web服务提供……”-e=;X!oe{b!=F.|Q9kL9QRemoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft®.NETRemoting提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。其主机与客户端的主要任务如下:ip'af\JJ,Mi,dyZ5主机任务H=Km)9$5|·设计服务,选择应用程序域、激活模式、通道、端口和发布。\6#&\N&kC%dNTEwd·实现Remoting主机应用程序域(例如IIS/系统服务)。y&+4FC9U-dT\Y+`BUHD·配置主机激活、通道和协议设置。建议使用配置文件,可以通过调用RemotingConfiguration.Configure加载。0S^[[gnVza}·发布接口,供客户端使用(有关详细信息,请参阅下文中的“接口发布选择”)。QXqkN~y=/5rXK客户端任务5AL/@Xix,|h/-;DCd·设计客户端,选择应用程序域和激活模式。hhV{!3*qE%li~6�·考虑是否需要注册通道和端口。r*0/6/3otYhK^?+·获取远程类型元数据。g\7ZOGMNqM?m·实现客户端应用程序域。{9*v![1r^di-|6U·配置客户端激活模式和其他类型的信息,如应用程序名称、通道和对象URI等。建议使用配置文件,可以通过调用RemotingConfiguration.Configure加载。yb*~!?dAHbt-�\m2Remoting解决方案的过程中可能会遇到的错误情况W&)gi'I在任何情况下,都应该记住要使用标准的设备使用和监视方法。事件记录仍是非常有价值的信息资源,就象网络监视器工具一样,网络监视器可以专门用于详细查看客户端/服务器的Remoting会话。中间层的Remoting服务器仍可以使用VisualStudio.NET提供的标准调试工具进行调试,例如,对于由IIS集成的Remoting服务器,可以通过向ASP.NET辅助进程附加调试会话(VisualStudio.Net|Debug[调试]|Processes[进程]|Attach[附加])来设置断点(如果资源可用)。但Remoting的错误很独特,下面列出了一些。请注意,所有错误都已使用.NETFrameworkSDK提供的BasicRemotingHelloSample的各版本进行了复现,服务器和客户端也已在单机上运行。故障现象与在网络链接上的相同,只是由于HTTP/TCP的超时设置不同,需要相当长的时间才能出现错误。\TgRNWclbPrDkx2.1丢失MarshalByRef!RS,L由于Remoting要通过引用以用于给定的类,该类必须只做一件事,就是继承MarshalByRefObject。假设开发人员忘记做这项工作,我们将得到一个System.Runtime.Remoting.RemotingException类型的异常,说明我们有一个“丢失的MarshalByReference”.J.`I*:nj':^LCu,是否能正确捕获和处理这个RemotingException将取决于程序员。(想想这个开发人员忘记了他应记住的唯一一件事。)$l:t3-GeW)Ng&,W$_[解决方法是:记住继承MarshalByRefObject!DwQ3D]caIOT}vVs2.2众所周知的服务器激活的错误服务器端点:3#a;~u对于服务器激活,Remoting服务器将其侦听处声明为端点。该端点一般包括一个对象URI(远程对象的众所周知名称),一个协议和一个端口号。当然,所有这些都可能配置错误。A[Wll`ny;b+G~Mp2.3错误的URI'^,kwU5由服务提供的BasicRemotingHelloSample的URI是HelloService.soap,如相关的web.config文件中所指定:qMF;~/z\m2I{configurationU;T/,P9G;4f]AUn^8system.runtime.remotingw�gHSu{U?cHY-0YUQapplication&Jzw`U�)n7YC]serviceFVYT5,itoo-}wellknownmode=SingleCalltype=Hello.HelloService,HellonmLObv427j`h{H'O0zobjectUri=HelloService.soap/=U[Zz^X+5!G$i]sM=+/serviceys0m/V8F'fUD\m/applicationfU5e/~Z$-\//1R.Q/system.runtime.remotingsnp+aQ%PXQhDWqz|/configuration`E9c,?^-q,GOJ此服务是IIS集成的。IIS集成要求URI带有后缀.rem或.soap,我们在服务器上使用.rope。在此实例中,我们将再次收到RemotingException,这次显示的文本是“对象/Hello.soap在服务器上已断开或不存在”。k-A!*|..{}fn)(请确保各个URI相互匹配!当IIS集成Remoting服务器时,还要确保URI以.rem或.soap结尾。ka`Hhdq!bzVkk2.4不匹配的协议/端口5x.u1J%为了进行此项测试,我们切换到控制台集成的服务器,以下是该服务器的配置文件:afk^=Zgh#Eu@Xoconfiguration%^8]gf7]uAZCgF'system.runtime.remoting^8.8:$;-OfPvoapplicationname=RemotingHelloFHHjA1K7yINrdpR{dservice]/{w}m7wq2_wellknownmode=SingleCalltype=Hello.HelloService,HelloT2kq;EdgO.LSaT'@SobjectUri=HelloService.soap/u((WKf8SM?sPQ/service-@}ZMb;�LAafqIchannels|M55iUjwg+~^,56ztchannelref=httpport=8000/*?'aL_a3r|,yILE.`/channelsh\%!_jt1OdsNB_dk/applicationkbwNGpPwHSRJCwj|/system.runtime.remotingck`\;rig5)^r8/configurationS?[43/T[%8GU9/9V-\假设我们要在服务器端将协议更改为TCP,而使客户端保留HTTP。0$%W=-O;&28[^我们将再次收到RemotingException,这次的文本是“底层连接已关闭:接收时出现意外错误”。H@NJg^C&-%#:~端口设置错误也会导致上述异常,唯一的不同是这种情况下,要用较长的时间才会出现错误。服务器和客户端之间的端口和协议必须匹配。r/d$w[Lw�Ik_q2.5丢失URII)5AK{*另一种可能性是远程服务器没有运行,例如,服务器由IIS集成,而虚拟应用程序或相关的程序集丢失。再次使用BasicHelloRemoting服务器,我们需要虚拟应用程序RemotingHello能够运行。如果不能运行,我们将收到未处理的异常(取决于调用代码),但这次的异常将是:“无法加载类型clr:Hello.HelloService,Hello”。W$)Z~;kDBJP在这些情况下,请确保虚拟应用程序在运行,而且所需的程序集正确地放置在相关的bin子文件夹中。-\*)AesBbL[tq总而言之,客户端必须正确地引用服务器定义的端点以便激活服务器,这意味着,端口、协议和URI的定义必须相互匹配。这太容易出错了。因此,如果服务器的位置定义为:saLq\SLwDO@!service{zzuA#Z6e-0#lLujwellknownmode=SingleCalltype=Hello.HelloService,HelloV{C:}\w`4`gobjectUri=HelloService.soap/Lb{]V]qqpW&/service72|gSq2~`ssYy!#s那么,客户的设置必须为:s@I?�5ysgJnAd(]?cclienturl=http://localhost/RemotingHelloc^7~7�!(?!tVotJwellknowntype=Hello.HelloService,HelloQ2-+nU+Mn;3!z&url=http://localhost/RemotingHello/HelloService.soap/7^8RC{_b-;5\'/client!4;9G2KQPs0uGTjT其中,URL表示集成Remoting服务的IIS虚拟应用程序,类型表示类和程序集名称。5.IdfiYnALTv`tZs3Remoting的特点a[K{$'P#3.1优点9-o-bL他的优点是用户既可以使用TCP信道方式进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的性通信2L@}mJ@_ozo_^BY,效率相对WebService要高不少;但是它的缺点也很明显,.netremoting只能应用于MS的.netframework之下。73;xC�+xzin$K\EQ4从性能上来讲Remoting的效率和传统的DCOM、COM+的性能很相近。fW:3udU_224rz03.2缺点$s&]'**A]这种三层设计的缺点与使用XMLWebservice的三层设计的缺点相同。G&zoQ96-4a4{,{所有业务规则均包含在前端代码中。因而,如果需要更改业务规则,则必须更新全部客户端。除非能够进行自动更新,否则这种维护工作将十分繁琐。当然,如果使用SQLServer,则可以将某些业务规则放到存储过程中,从而减少维护的时间和成本。Zl?/n2|?CKyf$ZJ所有字段名称均在源代码或控件属性中硬编码。如果更改字段名称,则必须查找和替换应用程序中所有该字段的名称。如果使用了数据绑定,还必须检查所有窗体并更改属性。