国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Remoting編程知識二

2024-07-21 02:25:25
字體:
來源:轉載
供稿:網友
中國最大的web開發資源網站及技術社區,
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框架來選擇端口數。

四、 如何異步調用一個可遠程化對象

缺省情況下,,調用遠程對象是同步的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 濮阳市| 弥勒县| 常山县| 玉溪市| 梅州市| 彰武县| 鹤岗市| 凤冈县| 嵊州市| 广州市| 申扎县| 庆阳市| 桂东县| 怀仁县| 双城市| 襄垣县| 金沙县| 山东省| 唐海县| 慈利县| 上虞市| 衡山县| 陈巴尔虎旗| 科尔| 胶南市| 云浮市| 福贡县| 且末县| 星子县| 许昌县| 关岭| 澜沧| 梁平县| 顺昌县| 烟台市| 阜平县| 莱阳市| 英山县| 岳阳县| 申扎县| 东乌|