100165480.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 260 行 · 第 1/4 页

HTM
260
字号
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; System.Console.ReadLine();</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; return;</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">这两个函数显示了知名对象和</span><span lang="EN-US" style="COLOR: black">Client-activated</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">public static void ShowWellKnownServiceTypes()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; WellKnownServiceTypeEntry[] entries =</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; RemotingConfiguration.GetRegisteredWellKnownServiceTypes();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; foreach (WellKnownServiceTypeEntry entry in entries)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;Console.WriteLine(&quot;Assembly: &quot; + entry.AssemblyName);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Mode: &quot; + entry.Mode);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;URI: &quot; + entry.ObjectUri);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Type: &quot; + entry.TypeName);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">public static void ShowActivatedServiceTypes()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; ActivatedServiceTypeEntry[] entries =</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; RemotingConfiguration.GetRegisteredActivatedServiceTypes();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; foreach (ActivatedServiceTypeEntry entry in entries)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Assembly: &quot; + entry.AssemblyName);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 14.5pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Type: &quot; + entry.TypeName);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">7. </span><span style="FONT-FAMILY: 黑体">使用配置文件的客户端代码</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在客户端代码中,只需使用配置文件</span><span lang="EN-US">client.exe.config</span><span style="FONT-FAMILY: 宋体">配置远程服务,之后,不论处理的是服务器激活的远程对象还是客户激活的远程对象,都可以使用运算符</span><span lang="EN-US">new</span><span style="FONT-FAMILY: 宋体">创建远程类</span><span lang="EN-US">Hello</span><span style="FONT-FAMILY: 宋体">的新实例。但是有一点不同:对于客户激活的对象而言,非默认的构造函数和运算符</span><span lang="EN-US">new</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><span lang="EN-US">new</span><span style="FONT-FAMILY: 宋体">只能针对这种对象调用远程对象中的构造函数。</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">在文件</span><span lang="EN-US">HelloClient.cs </span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US" style="COLOR: black">Main()</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法中,可以改变远程服务代码,使用配置文件和</span><span lang="EN-US">RemotingConfiguration.Configure()</span><span style="FONT-FAMILY: 宋体">,用</span><span lang="EN-US">new</span><span style="COLOR: black; FONT-FAMILY: 宋体">运算符</span><span style="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.Configure(&quot;HelloClient.exe.config&quot;);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Hello obj = new Hello();</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">if (obj == null)</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp; &nbsp;Console.WriteLine(&quot;could not locate server&quot;);</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; return;</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">for (int i=0; i &lt; 5; i++)</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; Console.WriteLine(obj.Greeting(&quot;Christian&quot;));</span></p>
<p class="2" style="MARGIN-TOP: 0cm; BACKGROUND: none transparent scroll repeat 0% 0%; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">8. </span><span style="FONT-FAMILY: 黑体">客户信道的延迟加载</span></h4>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">如果客户没有配置信道,使用配置文件</span><span lang="EN-US">machine.config</span><span style="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">&nbsp;&nbsp; &lt;system.runtime.remoting&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;application&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;channels&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;channel ref=&quot;http client&quot; displayFTEL=&quot;http client (delay loaded)&quot; </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delayLoadAsClientChannel=&quot;true&quot;/&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;channel ref=&quot;tcp client&quot; displayFTEL=&quot;tcp client (delay loaded)&quot;&nbsp;&nbsp; </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delayLoadAsClientChannel=&quot;true&quot;/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/channels&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/application&gt;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;/system.runtime.remoting&gt; </span></p>
<p class="MsoNormal"><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">特性</span><span lang="EN-US">delayLoadAsClientChannel</span><span style="FONT-FAMILY: 宋体">的值为</span><span lang="EN-US">true</span><span style="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">&lt;configuration&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;system.runtime.remoting&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;application FTEL=&quot;Client&quot;&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;client url=&quot;tcp:/localhost:6791/Hello&quot;&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;wellknown type = &quot;Wrox.ProCSharp.Remoting.Hello, RemoteHello&quot; </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url=&quot;tcp://localhost:6791/Hello/Hi&quot; /&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/client&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/application&gt;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;/system.runtime.remoting&gt;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">&lt;/configuration&gt;</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">9. </span><span style="FONT-FAMILY: 黑体">配置文件中的生存期服务</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">远程服务器的租约配置也可以使用应用程序配置文件来完成。元素</span><span lang="EN-US">&lt;lifetime&gt;</span><span style="FONT-FAMILY: 宋体">有</span><span lang="EN-US">leaseTime</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">sponsorshipTimeOut</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">renewOnCallTime</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> pollTime</span><span style="FONT-FAMILY: 宋体">特性。在下面的示例中可以看到这些特性:</span></p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?