100165473.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 90 行 · 第 1/2 页
HTM
90 行
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 0cm; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><a ftel="_Toc507815557"><span lang="EN-US" style="COLOR: black">16.5.3 ChannelServices</span></a><span style="COLOR: black; FONT-FAMILY: 黑体">和</span><span lang="EN-US" style="COLOR: black">RemotingConfiguration</span></h3>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span lang="EN-US" style="COLOR: black">ChannelServices</span><span style="COLOR: black; FONT-FAMILY: 宋体">实用类用于把信道注册到</span><span lang="EN-US" style="COLOR: black">.NET Remoting</span><span style="COLOR: black; FONT-FAMILY: 宋体">运行库中。此外,也可以使用这个类访问所有已注册的信道。因为在这里信道是隐式创建的</span><span lang="EN-US" style="COLOR: black">(</span><span style="COLOR: black; FONT-FAMILY: 宋体">详见后面的内容</span><span lang="EN-US" style="COLOR: black">)</span><span style="COLOR: black; FONT-FAMILY: 宋体">,所以,在使用配置文件配置信道时,</span><span lang="EN-US" style="COLOR: black">ChannelServices</span><span style="COLOR: black; FONT-FAMILY: 宋体">类是极其有用的。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="COLOR: black; FONT-FAMILY: 宋体">使用静态的方法</span><span lang="EN-US" style="COLOR: black">ChannelServices.RegisterChannel()</span><span style="COLOR: black; FONT-FAMILY: 宋体">可以注册信道。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="COLOR: black; FONT-FAMILY: 宋体">下面是注册</span><span lang="EN-US" style="COLOR: black">HTTP</span><span style="COLOR: black; FONT-FAMILY: 宋体">信道和</span><span lang="EN-US" style="COLOR: black">TCP</span><span style="COLOR: black; FONT-FAMILY: 宋体">信道的服务器代码:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">TcpChannel tcpChannel = new TcpChannel(8086);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">HttpChannel httpChannel = new HttpChannel(8085);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">ChannelServices.RegisterChannel(tcpChannel);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">ChannelServices.RegisterChannel(httpChannel);</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span lang="EN-US" style="COLOR: black">ChannelServices</span><span style="COLOR: black; FONT-FAMILY: 宋体">实用类可以用于分派同步和异步的消息,以及取消指定信道的注册。属性</span><span lang="EN-US" style="COLOR: black">RegisteredChannels</span><span style="COLOR: black; FONT-FAMILY: 宋体">返回一个</span><span lang="EN-US" style="COLOR: black">IChannel</span><span style="COLOR: black; FONT-FAMILY: 宋体">数组,数组中的元素是已注册的所有信道。此外,还可以使用</span><span lang="EN-US" style="COLOR: black">GetChannel()</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法根据名称获取指定的信道。使用</span><span lang="EN-US" style="COLOR: black">ChannelServices</span><span style="COLOR: black; FONT-FAMILY: 宋体">,可以编写定制的管理实用程序以管理信道。下面的小示例阐明了如何阻止服务器通道监听所传入的请求:</span><span lang="EN-US" style="COLOR: black"> </span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">HttpServerChannel channel =(HttpServerChannel)ChannelServices.GetChannel("http");</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">channel.Sto<span style="COLOR: black">pListening(null);</span></span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span lang="EN-US">RemotingConfiguration</span><span style="FONT-FAMILY: 宋体">类是另一个</span><span lang="EN-US">.NET Remoting</span><span style="FONT-FAMILY: 宋体">实用类。在服务器端,这个类用于为服务器激活的对象注册远程对象类型,把远程对象编组到已编组好的对象引用类</span><span lang="EN-US">ObjRef</span><span style="FONT-FAMILY: 宋体">中。</span><span lang="EN-US">ObjRef</span><span style="FONT-FAMILY: 宋体">是在电话线上发送的对象的可串行化表示。在客户端,为了从对象引用中创建代理对象,需要使用</span><span lang="EN-US">RemotingServices</span><span style="FONT-FAMILY: 宋体">解开远程对象的编组。</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">下面是一段服务器端代码,它用于把知名的远程对象类型注册为</span><span lang="EN-US" style="COLOR: black">RemotingServices</span><span style="COLOR: black; FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">RemotingConfiguration.RegisterWellKnownServiceType(</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US" style="COLOR: black"> typeof(Hello), // Type</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US" style="COLOR: black"> "Hi", // URI</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US" style="COLOR: black"> WellKnownObjectMode.SingleCall); // Mode</span></p>
<p class="MsoNormal"><span lang="EN-US">RegisterWellKnownServiceType()</span><span style="FONT-FAMILY: 宋体">的第一个参数是</span><span lang="EN-US" style="COLOR: black">typeof(Hello)</span><span style="FONT-FAMILY: 宋体">,它指定远程对象的类型。第二个参数</span><span lang="EN-US">Hi</span><span style="FONT-FAMILY: 宋体">是远程对象的</span><span lang="EN-US">URI</span><span style="FONT-FAMILY: 宋体">,从客户端访问远程对象时要使用这个</span><span lang="EN-US">URI</span><span style="FONT-FAMILY: 宋体">。最后一个参数是远程对象的模式。模式可以是枚举类型</span><span lang="EN-US">WellKnownObjectMode</span><span style="FONT-FAMILY: 宋体">的一个值:即</span><span lang="EN-US">SingleCall</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US"> Singleton</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">SingleCall</span><span style="FONT-FAMILY: 宋体">:</span><span lang="EN-US">SingleCall</span><span style="FONT-FAMILY: 宋体">意味着对象不保存状态,每一次调用远程对象时,都会创建一个新的实例。使用方法</span><span lang="EN-US">RemotingConfiguration.RegisterWellKnownServiceType()</span><span style="FONT-FAMILY: 宋体">和参数</span><span lang="EN-US">WellKnownObjectMode.SingleCall</span><span style="FONT-FAMILY: 宋体">,可以从服务器上创建</span><span lang="EN-US">SingleCall</span><span style="FONT-FAMILY: 宋体">对象。因为不需要为数千个客户保存资源,因此,这种模式在服务器上的效果是非常好的。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">Singleton</span><span style="FONT-FAMILY: 宋体">:使用</span><span lang="EN-US">Singleton</span><span style="FONT-FAMILY: 宋体">,服务器的所有客户都可以共享对象。一般情况下,如果要在所有的客户之间共享一些数据,则可以使用这种对象类型。对于只读数据来说这是毫无问题的,但是,对于可读写的数据,就必须考虑数据加锁和可伸缩性问题。使用</span><span lang="EN-US">Remoting Configuration. RegisterWellKnownServiceType()</span><span style="FONT-FAMILY: 宋体">方法和</span><span lang="EN-US">WellKnownObjectMode. Singleton</span><span style="FONT-FAMILY: 宋体">参数,服务器可以创建</span><span lang="EN-US">Singleton</span><span style="FONT-FAMILY: 宋体">对象。必须考虑</span><span lang="EN-US">Singleton</span><span style="FONT-FAMILY: 宋体">对象所使用资源的加锁问题。在客户并发地访问</span><span lang="EN-US">Singleton</span><span style="FONT-FAMILY: 宋体">对象时,必须确保数据不能被破坏,还必须检查锁是否足够有效,以便对数据进行必要的伸缩。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="COLOR: black; FONT-FAMILY: 宋体">如果远程对象应该保存某一特定客户的状态,则可以使用客户激活的对象。下一小节将讨论在客户端如何调用服务器激活的对象和客户激活的对象。在服务器端,客户激活的对象的注册方式必须与服务器激活的对象不同。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 18pt"><span style="FONT-FAMILY: 宋体">我们调用的不是</span><span lang="EN-US">RemotingConfiguration.RegisterWellKnownType()</span><span style="FONT-FAMILY: 宋体">,而是</span><span lang="EN-US">RemotingServices. RegisterActivatedServiceType()</span><span style="FONT-FAMILY: 宋体">。使用这个方法时,只指定类型,不指定</span><span lang="EN-US">URI</span><span style="FONT-FAMILY: 宋体">,原因是,对于客户激活的对象而言,客户可以使用同一个</span><span lang="EN-US">URI</span><span style="FONT-FAMILY: 宋体">对不同的对象类型进行实例化。所有客户激活的对象的</span><span lang="EN-US">URI</span><span style="FONT-FAMILY: 宋体">必须使用</span><span lang="EN-US">RemotingConfiguration.ApplicationName</span><span style="FONT-FAMILY: 宋体">进行定义:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US" style="COLOR: black"> RemotingConfiguration.ApplicationName = "HelloServer";</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US" style="COLOR: black"> RemotingConfiguration.RegisterActivatedServiceType(typeof(Hello));</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165472.htm">上一页</a> <a href="index.html">首页</a> <a href="100165474.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165473.htm'><font color='red'>16.5.3 ChannelServices和RemotingConfiguration</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165470.htm'>16.5 .NET Remoting体系结构</a></div><div style='float:right;width:49%'>·<a href='100165471.htm'>16.5.1 信道</a></div><div style='float:left;width:49%'>·<a href='100165472.htm'>16.5.2 格式标识符</a></div><div style='float:right;width:49%'>·<a href='100165474.htm'>16.5.4 对象的激活</a></div><div style='float:left;width:49%'>·<a href='100165475.htm'>16.5.5 消息接收器</a></div><div style='float:right;width:49%'>·<a href='100165476.htm'>16.5.6 在远程方法中传递对象</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?