日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
回顧.NETRemoting分布式開(kāi)發(fā)

回顧.NET Remoting分布式開(kāi)發(fā)

作者:風(fēng)塵浪子 2011-05-11 16:42:21

開(kāi)發(fā)

后端

分布式 .NET Remoting是采用分布式進(jìn)行編程的一種技術(shù),主要用于管理跨應(yīng)用程序域的同步和異步RPC 會(huì)話。本文主要介紹Remoting分布式開(kāi)發(fā),一起來(lái)看。

創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站、網(wǎng)站重做改版、三河網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為三河等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

記得在下第一次接觸.NET Remoting分布式開(kāi)發(fā)是在2003年,那時(shí)候是Framework1.0初次亮相之時(shí),Remoting分布式開(kāi)發(fā)是Framework1.0其中一個(gè)亮點(diǎn)。經(jīng)過(guò)多年的發(fā)展,在2005年,WCF隨著Framework2.0首先亮相。WCF是結(jié)合Remoting,Web服務(wù),TCP/IP套接字,MSMQ信息,P2P,WSE等多方通訊的混合體。

隨著WCF的出現(xiàn)是否意昧著Remoting即將沒(méi)落,答案是否定的。因?yàn)镽emoting有其獨(dú)到之處,在通訊效率,信息交換,安全性等多方面都有其特點(diǎn),所以在企業(yè)內(nèi)部系統(tǒng)的信息化交換層的開(kāi)發(fā)當(dāng)中,很多時(shí)候會(huì)使用Remoting進(jìn)行開(kāi)發(fā),在下面幾章為大家回顧一下Remoting的開(kāi)發(fā)。

一、基礎(chǔ)概念

Remoting是采用分布式進(jìn)行編程的一種技術(shù),主要用于管理跨應(yīng)用程序域的同步和異步RPC 會(huì)話。在默認(rèn)情況下,Remoting可從使用 HTTP 或 TCP 協(xié)議進(jìn)行信息通訊,并使用 XML 編碼的 SOAP 或二進(jìn)制消息格式進(jìn)行數(shù)據(jù)交換。.NET Remoting 提供了非常靈活和可擴(kuò)展的編程框架,并且可以管理對(duì)象的狀態(tài)。Remoting跟Web服務(wù)不同,它并不依賴(lài)于IIS,用戶(hù)可以自己開(kāi)發(fā)(Development)并部署(Dispose)宿主服務(wù)器,只需要服務(wù)器支持Framework。

二、Remoting的特點(diǎn)

Remoting可以靈活的定義其所基于的協(xié)議,比如http,tcp等。在使用TCP/IP的時(shí)候,Remoting能發(fā)揮更高的效率,其性能接近于DCOM。

Remoting一般需要通過(guò)一個(gè)應(yīng)用程序或是Windows服務(wù)來(lái)承載,也可以使用iis部署。

Remoting必須要在一個(gè)支持Framework的開(kāi)發(fā)環(huán)境下進(jìn)行開(kāi)發(fā),無(wú)論客戶(hù)端跟服務(wù)器端都必須支持Framework。

Remoting 支持許多狀態(tài)管理選項(xiàng),并且可能與來(lái)自同一個(gè)用戶(hù)的多個(gè)調(diào)用相關(guān)或不相關(guān),這取決于您選擇的對(duì)象生命周期架構(gòu)。

三、利用Remoting實(shí)現(xiàn)分布式開(kāi)發(fā)的優(yōu)點(diǎn)

容錯(cuò)性

容錯(cuò)性是指一個(gè)系統(tǒng)在出現(xiàn)故障時(shí),系統(tǒng)應(yīng)當(dāng)能及時(shí)恢復(fù)。利用Remoting實(shí)現(xiàn)分布式應(yīng)用開(kāi)發(fā)可以建立容錯(cuò)軟件系統(tǒng),當(dāng)某個(gè)功能發(fā)生錯(cuò)誤時(shí),不會(huì)影響整體系統(tǒng)的工作。使系統(tǒng)能夠及時(shí)維護(hù)及更新。

可擴(kuò)展性

可擴(kuò)展性是指系統(tǒng)可以利用性能上的遞增處理日益增加的負(fù)載量。利用Remoting實(shí)現(xiàn)分布式開(kāi)發(fā),可以將最重要的核心功能模塊放置于性能強(qiáng)大的幾臺(tái)主機(jī)上,把其他的功能放置于功能稍差的客戶(hù)端機(jī)上,隨著客戶(hù)的增加而加大客戶(hù)端主機(jī)的服務(wù)。這樣做可以減少開(kāi)發(fā)成本,提高主體性能。

易于管理

一個(gè)大型計(jì)算機(jī)管理系統(tǒng)是非常復(fù)雜的,可能涉及的是異地機(jī)器之間的代碼調(diào)節(jié)。利用Remoting實(shí)現(xiàn)分布式開(kāi)發(fā),可以把核心的功能代碼移植到中央服務(wù)器,把頁(yè)面層,UI層等功能于客戶(hù)端實(shí)現(xiàn)。這樣系統(tǒng)的性能調(diào)節(jié),代碼升級(jí)都可以在中央服務(wù)器里綜合實(shí)現(xiàn),而忽略對(duì)客戶(hù)端的影響。

四、Remoting體系結(jié)構(gòu)

下面詳細(xì)介紹一下Remoting的體系結(jié)構(gòu),如下圖。

在客戶(hù)發(fā)送請(qǐng)求時(shí)可以通過(guò)Activator.GetObject()和 Activator.CreateInstance()返回一個(gè)透明代理對(duì)象。實(shí)際上透明代理就像一個(gè)遠(yuǎn)程對(duì)象,它執(zhí)行遠(yuǎn)程對(duì)象的所有公共方法,這些方法調(diào)用真實(shí)對(duì)象的Invoke()方法,傳送包含方法調(diào)用的消息。

當(dāng)消息進(jìn)入Channel通道后,就會(huì)經(jīng)過(guò)接收器處理。接收器包含格式接收器、通道接收器和傳輸接收器,其中格式接收器和傳輸接收器是必要的。首先格式接收器會(huì)使用SoapFormatter或BinaryFormatter的方式對(duì)傳輸?shù)膶?duì)象進(jìn)行序列化,如果用戶(hù)設(shè)定了通道接收器,系統(tǒng)將會(huì)對(duì)其進(jìn)行對(duì)應(yīng)處理,最后把信息送到傳輸接收器,對(duì)應(yīng)設(shè)定TCP或HTTP傳輸方式加入傳輸接收器頭。當(dāng)信息發(fā)送到服務(wù)器,服務(wù)器將會(huì)根據(jù)傳輸接收器頭對(duì)信息進(jìn)行處理,然后在格式化接收器中對(duì)信息進(jìn)行反序列化,最后通過(guò)真實(shí)代理處理遠(yuǎn)程對(duì)象。至于“通道接收器”的處理方式,將在后幾章為大家進(jìn)一步地介紹。

五、簡(jiǎn)單實(shí)例

說(shuō)了這么多,下面就以一個(gè)簡(jiǎn)單的例子說(shuō)明一下Remoting的開(kāi)發(fā)過(guò)程吧。

首先建立一個(gè)Model.dll,注意因?yàn)閷?duì)象要進(jìn)行序列化轉(zhuǎn)化,必須對(duì)其加上Serializable特性!

代碼:

  
 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. namespace Model{ [Serializable]   
  6. public class Person { public int ID { get; set; }   
  7. public String Name {   
  8. get;   
  9. set;   
  10. }   
  11. public int Age   
  12. { get; set; } }  

然后建立一個(gè)可遠(yuǎn)程調(diào)用的對(duì)象,注意遠(yuǎn)程對(duì)象必須繼續(xù)MarshalByRefObject

代碼:

  
 
 
 
  1. using System;  
  2. using System.Collections.Generic;using System.Linq;using System.Text;  
  3. using System.Runtime.Serialization.Formatters.Binary;  
  4. using System.IO;using Model;  
  5. namespace Manager{      
  6. //類(lèi)必須繼承了MarshalByRefObject,才能進(jìn)行遠(yuǎn)程調(diào)用      
  7. public class PersonManager:MarshalByRefObject    {          
  8. public List GetList()          
  9. {              
  10. List personList = new List();    
  11. FileStream stream = new FileStream("DataSource.sour", FileMode.Open, FileAccess.Read);    
  12. //在服務(wù)器文件里面獲取虛擬數(shù)據(jù)              
  13. BinaryFormatter formatter = new BinaryFormatter();              
  14. personList=(List)formatter.Deserialize(stream);    
  15. //對(duì)虛擬數(shù)據(jù)進(jìn)行反序列化獲取集合              
  16. return personList;          
  17. }      
  18. }} 

在一個(gè)應(yīng)用程序中加載服務(wù)器端,服務(wù)器端的配置有兩種試,一是直接寫(xiě)在代碼里面。首先建立服務(wù)傳送方式,可以選擇用TcpServerChannel,也可使用HttpChannel,前者有著更高的效率。然后在ChannelService注冊(cè)此傳輸通道,最后通過(guò)RemotingConfiguration的RegisterWellKnownServiceType方法注冊(cè)遠(yuǎn)程對(duì)象。

注意WellKonwnObjectMode可選擇為SingleTon或者SingleCall,前者使用單體模式,每個(gè)客戶(hù)端進(jìn)行訪問(wèn)都會(huì)使用同一個(gè)遠(yuǎn)程對(duì)象。后者會(huì)為每個(gè)請(qǐng)求建立一個(gè)遠(yuǎn)程對(duì)象。在這個(gè)例子里面我們使用SingleTon單體模式。

代碼:
 

  
 
 
 
  1. using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Tcp;using Model;using Manager;namespace Server{      
  2. class Program      
  3. {          
  4. static void Main(string[] args)          
  5. {              
  6. //建立服務(wù)傳輸方式,可選擇TCP或者HTTP,前者更能發(fā)揮高效性              
  7. TcpServerChannel channel = new TcpServerChannel(8089);              
  8. //注冊(cè)通道              
  9. ChannelServices.RegisterChannel(channel, false);              
  10. //添加可調(diào)用的遠(yuǎn)程對(duì)象,WellKonwnObjectMode可選擇為SingleTon或者SingleCall            RemotingConfiguration.RegisterWellKnownServiceType(typeof(PersonManager), "PersonTcp", WellKnownObjectMode.Singleton);            Console.ReadKey();          
  11. }      
  12. }} 

第二,可以在config文件里面實(shí)現(xiàn)服務(wù)器的配置,其效果與代碼實(shí)現(xiàn)的相同。

  
 
 
 
  1.         
  2.         
  3.           
  4. //定義傳送模式,遠(yuǎn)程對(duì)象類(lèi),Uri路徑          
  5.        
  6.         
  7.           
  8. //定義傳送通道,傳送方式和接口          
  9.         
  10.       
  11.    

最后在客戶(hù)端對(duì)遠(yuǎn)程對(duì)象進(jìn)行調(diào)用。

代碼:

  
 
 
 
  1. using System.Runtime.Remoting.Channels;  
  2. using System.Runtime.Remoting.Channels.Tcp;  
  3. using Model;  
  4. using Manager;  
  5. namespace Client{      
  6. class Program      
  7. {          
  8. static void Main(string[] args)          
  9. {              
  10. //確立通道傳送方式              
  11. ChannelServices.RegisterChannel(new TcpClientChannel(),false);              
  12. //使用Activator.GetObject()或者Activator.CreateInstance()方法建立透明代理,控制遠(yuǎn)程對(duì)象              
  13. PersonManager personManager = (PersonManager)Activator.GetObject(typeof(PersonManager), "tcp://localhost:8089/PersonUri");      
  14. //獲取遠(yuǎn)程數(shù)據(jù)              
  15. List personList = personManager.GetList();              
  16. Console.Write(personList.Count);            Console.ReadKey();          
  17. }      
  18. }} 

六、總結(jié)

上面已經(jīng)為大家介紹了一個(gè)簡(jiǎn)單的Remoting開(kāi)發(fā)實(shí)例。利用Remoting實(shí)現(xiàn)分布式開(kāi)發(fā),可以對(duì)遠(yuǎn)程對(duì)象的生命周期進(jìn)行管理,利用HttpChannel,HttpServerChannel,HttpServerTransportSink,HttpClientChannel,HttpClientTransportSinkProvider,HttpClientTransportSink等對(duì)象控制服務(wù)器端和客戶(hù)端的通道,使用代理、消息接收器與通道接收器對(duì)信息進(jìn)行管理,在下面幾章將為各位一一介紹。


文章題目:回顧.NETRemoting分布式開(kāi)發(fā)
網(wǎng)站網(wǎng)址:http://m.5511xx.com/article/dhiocch.html