凯锐

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Remoting高級知識

一、 如何使用iis作為啟動代理
.net remoting和dcom之間的一個區別是前者不支援自動運行的伺服器進程。需要人工啟動伺服器進程來註冊用來遠端啟動的類和監聽請求。而對於dcom,當遠端用戶端調用cocreateinstanceex或者其他啟動api時,會自動運行伺服器進程。
.net remoting 提供了兩種方法來避免人工啟動伺服器。

第一個是將伺服器應用程式當做一個服務來實現。可以編寫一個從
system.serviceprocess.service派生的服務,重載其中關鍵的需方法例如onstart和onstop。將伺服器當做一個服務來實現的好處是你可以配置該服務以便系統啟動時能自動運行該服務。
第二個方法是使用iis作為啟動代理。iis本身就是一個服務,在大多數web servers運行時會一直啟動。而且iis能夠通過使用.net remoting機制來回應用戶端啟動物件的請求。使用iis有以下幾個好處:
1、不再需要編寫一個用來註冊可遠端化的類和監聽埠的伺服器,iis就是伺服器。
2、可以使用iis鑒別遠端調用者,也可以使用ssl來保護資料。
3、可以使用iis來管理埠。如果在一個機器上部署了兩個傳統的應用程式伺服器,則需要你來保證這兩個伺服器使用不同的埠。使用iis作為宿主,則iis可以選擇埠,這樣可以簡化發佈和管理。
iis支援伺服器端啟動物件和用戶端啟動物件。可以使用程式註冊(在global.asax中),也可以使用聲明註冊(在web.config中)。
1、伺服器端啟動物件
下麵的web.config註冊了使用iis啟動的clock類:

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="singlecall" type="clock, clockserver" objecturi="clock.rem" />
</service>
</application>
</system.runtime.remoting>
</configuration> 

注意clock的uri:clock.rem。使用iis註冊的uri必須以.rem或者.soap結束,因為該擴展對應到iis原資料中的aspnet_isapi.dll和machine.config中的.net remoting 子系統。

使用iis啟動物件都是通過http通道來與用戶端進行通信。用戶端必須註冊http通道。下面是一個用戶端如何創建一個clock實例,假設clock在本地機器上一個叫myclock的虛擬目錄中。

httpclientchannel channel = new httpclientchannel ();
channelservices.registerchannel (channel);
remotingconfiguration.registerwellknownclienttype
(
typeof (clock),"http://localhost/myclock/clock.rem");
clock clock 
= new clock (); 


注意伺服器和用戶端都沒有指定埠,iis選擇該埠

2、用戶端啟動物件

web.config檔註冊註冊一個用戶端啟動物件clock

<configuration>
<system.runtime.remoting>
<application>
<service>
<activated type="clock, clockserver" />
</service>
</application>
</system.runtime.remoting>
</configuration> 

下麵是用戶端的寫法(依然假設clock在本地機器myclock虛擬目錄中):

httpclientchannel channel = new httpclientchannel ();
channelservices.registerchannel (channel);
remotingconfiguration.registeractivatedclienttype
(
typeof (clock), "http://localhost/myclock");
clock clock 
= new clock (); 

注意:使用iis必須在虛擬目錄中有一個可遠端化的類,而且必須把 web.config放在單獨的虛擬目錄中(例如myclock),把dll放在bin子目錄中(myclock\bin)。

二、 如何通過http通道傳遞二進位格式資料
使用iis的一個缺點是只能使用http通道。http通道將調用封裝成soap消息,這樣會增加消息的長度。iis只支持http通道,但它並 不要求使用將通道調用封裝成soap消息。默認情況下,http使用soap,因為它使用soapclientformattersinkprovide 和
soapserverformattersinkprovider來作為序列化和反序列化消息的格式。可以使用binaryclientformattersinkprovider和
binaryserverformattersinkprovder來替換它們。二進位消息可以跟好的利用網路帶寬。
下麵的web.config檔註冊了一個可以被iis啟動的clock,它使用二進位替換了缺省的soap格式。

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="singlecall" type="clock, clockserver"
objecturi
="clock.rem" />
</service>
<channels>
<channel ref="http server">
<serverproviders>
<formatter ref="binary" />
</serverproviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration> 

用戶端寫法如下:

httpclientchannel channel = new httpclientchannel
(
"httpbinary"new binaryclientformattersinkprovider ());
channelservices.registerchannel (channel);
remotingconfiguration.registerwellknownclienttype
(
typeof (clock), "http://localhost/myclock/clock.rem");
clock clock 
= new clock (); 

當使用配置檔時,寫法為:
remotingconfiguration.configure ("client.exe.config");
clock clock 
= new clock ();

配置檔內容如下:

<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="clock, clockserver"
url
="http://localhost/myclock/clock.rem" />
</client>
<channels>
<channel ref="http client">
<clientproviders>
<formatter ref="binary" />
</clientproviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration> 

使用相同的方法,你也可以在tcp通道中使用soap格式封裝消息。你甚至可以將自己的格式化方法插入到現有的通道中。

三、 如何使用事件和代理
假設你創建了一個clock 類,包括一個newhour事件,代碼如下:

public delegate void newhourhandler (int hour);
public class clock : marshalbyrefobject
{
public event newhourhandler newhour;


在iis上使用的web.config文件如下:

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="singleton" type="clock, clockserver"
objecturi
="clock.rem" />
</service>
<channels>
<channel ref="http" />
</channels>
</application>
</system.runtime.remoting>
</configuration> 

注意ref屬性,http值使得two-way httpcannel代替了one-way httpserverchannel。
用戶端寫法如下:
remotingconfiguration.configure ("client.exe.config");
clock clock 
= new clock ();
clock.newhour 
+= new newhourhandler (onnewhour);
.
.
.
public void onnewhour (int hour)
{
// newhour event received
}

<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="clock, clockserver"
url
="http://localhost/myclock/clock.rem" />
</client>
<channels>
<channel ref="http" port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration> 

用戶端也註冊了一個two-way httpchannel,並且指定埠號為0。0值使得通道監聽回調,當然也可以允許.net框架來選擇埠數。

四、 如何非同步調用一個可遠端化物件
缺省情況下,,調用遠端物件是同步的。

 源文地址﹕http://www.z6688.com/info/35449-1.htm


posted on 2006-10-04 14:20  凯锐  阅读(714)  评论(0编辑  收藏  举报