亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

一步一步學Remoting之四:承載方式

系統 1710 0
在實際的應用中我們通常只會選擇用windows服務和iis來承載遠程對象。選擇windows服務的原因是能自啟動服務,服務器重啟后不需要再去考慮啟動service。選擇iis的理由是我們能使用集成驗證等一些iis的特性。
在msdn中可以找到相關文章:

http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/BuildSucApp/BSAAsecmodsecmod29.mspx

http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconRemotingExampleHostingInIIS.asp

可能大家會覺得這個過程將是一個復雜的過程,其實不然,下面說一下實現方法,步驟非常少。

先來建立遠程對象
using ?System;?
using ?System.Data;
using ?System.Data.SqlClient;

namespace ?RemoteObject?
{?
????
public ? class ?MyObject:MarshalByRefObject?
????{?
????????
public ?DataSet?GetData()
????????{
????????????SqlConnection?conn
= new ?SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ " strconn " ]);
????????????SqlDataAdapter?da
= new ?SqlDataAdapter( " select?*?from?UBI_ProvinceMaster " ,conn);
????????????DataSet?ds
= new ?DataSet();
????????????da.Fill(ds);
????????????
return ?ds;
????????}
????}
}?

客戶端仍然是一個控制臺來進行測試:
RemoteObject.MyObject?app? = ?(RemoteObject.MyObject)Activator.GetObject( typeof (RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings[ " ServiceURL " ]);
????????????DataTable?dt
= app.GetData().Tables[ 0 ];
????????????
foreach (DataRow?dr? in ?dt.Rows)
????????????{
????????????????Console.WriteLine(dr[
" iPrMId " ] + " ? " + dr[ " vPrMName " ]);
????????????}
????????????Console.ReadLine();

服務端配置文件:
< configuration >
????
< appSettings >
????????????
< add? key ="strconn" ?value ="server=(local);uid=sa;pwd=;database=UBISOFT" ? />
????
</ appSettings >
????
< system .runtime.remoting >
????????
< application? name ="RemoteServer" >
????????????
< service >
????????????????
< wellknown? type ="RemoteObject.MyObject,RemoteObject" ?objectUri ="RemoteObject.MyObject"
????????????????????mode
="SingleCall" ? />
????????????
</ service >
????????????
< channels >
????????????????
< channel? ref ="tcp" ?port ="9999" />
????????????
</ channels >
????????
</ application >
????
</ system.runtime.remoting >
</ configuration >

運行程序,我們得到的是一個省市的列表:
一步一步學Remoting之四:承載方式

一、windows服務承載
用vs.net制作一個windows服務的過程基本不超過10個步驟,所以我們不需要害怕。
1、建立一個新的windows服務項目RemoteServer1
2、打開Service1代碼視圖,找到OnStart部分,加入代碼
System.Runtime.Remoting.RemotingConfiguration.Configure(AppDomain.CurrentDomain.BaseDirectory? + ? " RemoteServer1.exe.config " );
(不要遺漏AppDomain.CurrentDomain.BaseDirectory + )
config和控制臺方式的config是一樣的,我們讓這個windows服務做的僅僅是從config文件讀出配置信息進行配置通道。別忘記添加配置文件。
3、切換到設計視圖,右鍵-添加安裝程序
4、切換到新生成的ProjectInstaller.cs設計視圖,找到serviceProcessInstaller1對Account屬性設置為LocalSystem,對serviceInstaller1的ServiceName屬性設置為RemoteServer1(服務的名字),StartType屬性設置為Automatic(系統啟動的時候自動啟動服務)
5、別忘記對添加RemoteObject的引用
6、建立一個新的安裝項目RemoteServerSetup(我們為剛才那個服務建立一個安裝項目)
7、右鍵-添加-項目輸出-主輸出-選擇RemoteService1-確定
8、右鍵-視圖-自定義操作-自定義操作上右鍵-添加自定義操作-打開應用程序文件夾-選擇剛才那個主輸出-確定
9、重新生成這個安裝項目-右鍵-安裝
10、在服務管理器中(我的電腦-右鍵-管理-服務和應用程序-服務)找到RemoteServer1服務,啟動服務
現在就可以打開客戶端測試了!

一些FAQ:
1、啟動服務的時候系統說了類似“服務什么都沒有做,服務已經被停止”表示什么?
表示windows服務出錯了,一般是服務的程序有問題,檢查服務做了什么?在我們這個程序中僅僅添加了一行代碼,一般不會出現這個錯誤。
2、運行客戶端出現“服務器無響應”?
先檢查windows服務配置文件是不是正確設置了激活方式和激活對象,客戶端服務端端口號是否統一?
3、運行客戶端出現“無法找到程序集”?
檢查windows服務配置文件是否正確配置了激活對象的類型和uri?服務是否添加了遠程對象引用?
4、遠程對象類中有用到System.Configuration.ConfigurationSettings.AppSettings["strconn"],但是遠程對象并沒有配置文件,它從哪里讀取這個config的?
因為遠程對象不是獨立存在的,它是被windows服務承載的,因此它從windows服務的配置文件中讀取一些配置信息,遠程對象本生不需要配置文件。
5、安裝的時候是不是要卸載服務?
不需要,安裝程序會 停止服務端-》卸載服務-》安裝服務
6、在正式使用的時候怎么部署我們的系統?
如果客戶端是程序僅僅只要把安裝項目下面3個文件傳到服務器進行安裝,配置好config文件(比如連接字符串),開啟服務即可。如果客戶端是網站,同樣把服務在服務器安裝,配置好config文件(比如連接字符串),開啟服務,最后把網站傳到web服務器(可能和service不是同一個服務器)。
7、部署的時候需要傳遠程對象dll嗎?
不需要,可以看到安裝項目中已經自動存在了這個dll。
8、這樣的系統有什么特點?
一個web服務器,多個service服務器,多個sqlservice服務器,web服務器負擔比較小,所有的邏輯代碼都分布到不同的service服務器上面。

最后說一個測試的tip:
如果我們遠程調用對象進行測試程序非常麻煩,我們需要這么做
修改了遠程對象-》重新編譯安裝程序-》在自己機器重新安裝服務-》啟動服務-》查看結果
其實可以這么做:
1、修改遠程對象中的連接數據庫字符串,由于不是遠程對象了,我們必須從本地讀取連接字符串,比如上列我們直接修改為:
SqlConnection conn=new SqlConnection("server=(local);uid=sa;pwd=;database=UBISOFT");
2、修改客戶端代碼,直接實例化遠程對象
// RemoteObject.MyObject?app?=?(RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
????????????RemoteObject.MyObject?app? = ? new ?RemoteObject.MyObject();


等到正式部署的時候我們還原數據庫連接字符串從config文件中讀取,還原遠程對象從遠程讀取即可。

如果對windows服務還不是很清楚,請看以下文章:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbwlkwalkthroughcreatingwindowsserviceapplication.asp

http://www.cnblogs.com/lovecherry/archive/2005/03/25/125527.html




這里來說一下iis承載方式,順便簡單說一下remoting的通道和【復雜對象】中的遺留問題。

首先明確一點:iis來承載的話只能是http通道方式的。

我們來建立一個web項目,比如叫remoting,刪除項目中的所有webform,把遠程對象dll-RemoteObject.dll復制到項目的dll文件夾下面,然后打開web.config進行服務端設置:
< configuration >
????
< appSettings >
????????????
< add? key ="strconn" ?value ="server=(local);uid=sa;pwd=;database=UBISOFT" ? />
????
</ appSettings >
????
< system .runtime.remoting >
????????
< application >
????????????
< service >
????????????????
< wellknown? type ="RemoteObject.MyObject,RemoteObject" ?objectUri ="MyObject.soap"
????????????????????mode
="SingleCall" ? />
????????????
</ service > ????
????????????
< channels >
????????????????
< channel? ref ="http" />
????????????
</ channels > ????
????????
</ application >
????
</ system.runtime.remoting >
</ configuration >

來分析一下這個config:
1、可能大家還不是很理解type屬性,其實type屬性分兩部分 <命名空間.類名>,<程序集>
2、objectURi是用來表示對象的uri的,到時候我們用這個uri來連接到服務端
3、我們需要為uri指定soap(soap格式化)或者rem(二進制格式化)后綴

要進行測試其實很簡單,我們在瀏覽器輸入:http://localhost/remoting/MyObject.soap?wsdl
進行測試,如果發生問題基本就是配置文件的問題或者對象dll沒有正確復制到dll目錄

接下來修改一下客戶端的配置文件就可以了,主要是修改地址。

< configuration >
?
< appSettings >
?
< add? key ="ServiceURL" ?value ="http://localhost/remoting/MyObject. soap"/>
?
</ appSettings >
</ configuration >

iis承載方式默認是80端口,我們不需要在端口上做任何設置。還需要注意到的是iis方式,我們使用這樣的格式作為地址:
http://ip地址/虛擬目錄/遠程對象.soap

運行了客戶端以后如果我們的數據量比較大的話,就算是本機我們也能感受到延遲,比tcp方式延遲厲害很多很多,其實http方式的remoting效率比webservice還要差,具體選擇http方式的remoting還是webservice還是要看我們是不是對對象的狀態有需求。

iis的部署也是自動啟動服務的,還有一個優點就是可以結合iis的windows身份認證,這個參照一些iis的配置文章,這里就不說了。

下面還是要來看一下兩種【 通道】
??? 默認情況下,HTTP 通道使用 SOAP 格式化程序,因此,如果客戶端需要通過 Internet 訪問對象,則可以使用 HTTP 通道。由于這種方法使用 HTTP,所以允許客戶端通過防火墻遠程訪問 .NET 對象。將這些對象集成在 IIS 中,即可將其配置為 Web 服務對象。隨后,客戶端就可以讀取這些對象的 WSDL 文件,以便使用 SOAP 與 Remoting 對象通信。
??? 默認情況下,TCP 通道使用二進制格式化程序。此格式化程序以二進制格式進行數據的序列化,并使用原始套接字在網絡中傳送數據。如果對象部署在受防火墻保護的封閉環境中,則此方法是理想的選擇。該方法使用套接字在對象之間傳遞二進制數據,因此性能更好。由于它使用 TCP 通道來提供對象,因此具有在封閉環境中開銷較小的優點。由于防火墻和配置問題,此方法不能在 Internet 上使用。

因此我們也需要更根據自己的需求來選擇通道!看看remoting有這么多可以選擇的方式:選擇激活模式,選擇通道,選擇承載方式,如此多的選擇給了我們靈活的同時也增加了理解remoting的難度。

msdn相關章節: http://msdn.microsoft.com/library/CHS/cpguide/html/cpconChannels.asp

最后說一下前面的遺留問題,為什么會發生這個安全異常?
http://www.cnblogs.com/lovecherry/archive/2005/05/20/159335.html

msdn說:
依賴于運行時類型驗證的遠程處理系統必須反序列化一個遠程流,然后才能開始使用它,未經授權的客戶端可能會試圖利用反序列化這一時機。為了免受這種攻擊,.NET 遠程處理提供了兩個自動反序列化級別:Low 和 Full。Low(默認值)防止反序列化攻擊的方式是,在反序列化時,只處理與最基本的遠程處理功能關聯的類型,如自動反序列化遠程處理基礎結構類型、有限的系統實現類型集和基本的自定義類型集。 Full 反序列化級別支持遠程處理在所有情況下支持的所有自動反序列化類 型。

我們首先來修改服務端的配置文件:

< configuration >
????
< system .runtime.remoting >
????????
< application? name ="RemoteServer" >
????????????
< service >
????????????????
< wellknown? type ="RemoteObject.MyObject,RemoteObject" ?objectUri ="RemoteObject.MyObject"
????????????????????mode
="Singleton" ? />
????????????
</ service >
????????????
< channels >
????????????????
< channel? ref ="tcp" ?port ="9999" />
????????????????
< serverProviders > ?
????????????????????
< provider? ref ="wsdl" ? />
????????????????????
< formatter? ref ="soap" ?typeFilterLevel ="Full" ? />
????????????????????
< formatter? ref ="binary" ?typeFilterLevel ="Full" ? />
????????????????????
</ serverProviders >
????????????
</ channels >
????????
</ application >
????
</ system.runtime.remoting >
</ configuration >

當然也可以用程序進行設置:
using ?System;
using ?System.Collections;
using ?System.Runtime.Remoting;
using ?System.Runtime.Remoting.Channels;
using ?System.Runtime.Remoting.Channels.Tcp;
using ?System.Runtime.Serialization.Formatters;

RemotingConfiguration.RegisterWellKnownServiceType( typeof (RemoteObject.MyObject),? " RemoteObject.MyObject " ,?WellKnownObjectMode.Singleton);
????????????BinaryServerFormatterSinkProvider?serverProvider?
= ? new ?BinaryServerFormatterSinkProvider();?
????????????BinaryClientFormatterSinkProvider?clientProvider?
= ? new ?BinaryClientFormatterSinkProvider();?
????????????serverProvider.TypeFilterLevel?
= ?TypeFilterLevel.Full;?
????????????IDictionary?props?
= ? new ?Hashtable();?
????????????props[
" port " ]? = ? 9999 ;?
????????????TcpChannel?channel?
= ? new ?TcpChannel(props,clientProvider,serverProvider);?
????????????ChannelServices.RegisterChannel(channel);?
????????????Console.ReadLine();

客戶端還要用程序進行調整:
若要使用配置文件設置反序列化級別,必須顯式指定 <formatter> 元素的 typeFilterLevel 屬性。雖然這通常是在服務器端指定的, 但您還必須為注冊來偵聽回調的客戶端上的任何信道指定這一屬性 ,以控制其反序列化級別

在程序前面加上和服務端基本相同的代碼:
BinaryServerFormatterSinkProvider?serverProvider? = ? new ?BinaryServerFormatterSinkProvider();?
????????????BinaryClientFormatterSinkProvider?clientProvider?
= ? new ?BinaryClientFormatterSinkProvider();?
????????????serverProvider.TypeFilterLevel?
= ?TypeFilterLevel.Full;?
????????????IDictionary?props?
= ? new ?Hashtable();?
????????????props[
" port " ]? = ? 0 ;?
????????????TcpChannel?channel?
= ? new ?TcpChannel(props,clientProvider,serverProvider);?
????????????ChannelServices.RegisterChannel(channel);?

這樣就可以了,注意:如果在同一個機器上面測試端口號應設為不同于服務器端設置的端口號,推薦設置為0(遠程處理系統自動選擇可用端口)

.NET Remoting 自身不提供安全模型。然而,通過將遠程對象駐留在 ASP.NET 中并使用 HTTP 通道進行通信,遠程對象可以使用 IIS 和 ASP.NET 提供的基本安全服務。比較而言,TCP 通道和自定義的主機可執行文件能夠提供更高的性能,但這種組合不提供內置的安全功能。

? 若要對客戶端進行身份驗證,請使用 HTTP 通道,在 ASP.NET 中駐留對象,以及在 IIS 中禁用匿名訪問。
?
? 如果您不擔心客戶端身份驗證問題,請使用 TCP 通道,它可以提供更高的性能。
?
? 如果您使用 TCP 通道,請使用 IPSec 保護客戶端和服務器之間的通信通道。使用 SSL 來保護 HTTP 通道。
?
? 如果您需要對遠程資源進行受信任的調用,請將組件駐留在 Windows 服務中,而不是駐留在控制臺應用程序中。
?
? 始終不要向 Internet 公開遠程對象。在這種情況下,請使用 Web 服務。
應該僅在 Intranet 中使用 .NET Remoting。應該使用內部方式從 Web 應用程序訪問對象。即使對象駐留在 ASP.NET 中,也不要向 Internet 客戶端公開它們,因為客戶端必須是 .NET 客戶端。

最后,讓我們來看一篇msdn有關remoting安全的文章:
http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/BuildSucApp/BSAAsecmod11.mspx

?

TrackBack:http://www.cnblogs.com/lovecherry/archive/2005/05/20/159598.html

一步一步學Remoting之四:承載方式


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产成+人+综合 | 国产福利在线免费 | 天天操天天操天天操香蕉 | 亚洲情区| 国产区精品福利在线观看精品 | 精品欧美高清一区二区免费 | 欧美一区二 | 亚洲综合在线成人一区 | 夜夜cao | 欧美四虎影院 | 色婷婷精品 | 91国视频 | 欧美性生活在线 | 久久天天丁香婷婷中文字幕 | 七月婷婷精品视频在线观看 | 欧美精品大片 | 一级毛片aa高清免费观看 | 福利影院在线 | 亚洲免费视频一区二区三区 | 色人阁综合 | 久草视频在线免费播放 | 日本国产一区二区三区 | 亚洲精品777 | 国产中文字幕免费观看 | 色综合久久久久久久 | 亚洲精品久久久久久小说 | 国产精品视频一区二区猎奇 | 欧美一级艳片视频免费观看 | 日日夜操 | 日本欧美在线播放 | 亚洲视频在线观看免费视频 | 亚洲自拍中文 | 又爽又黄又无遮挡的视频在线观看 | 精品免费看 | 亚洲一区二区三区在线视频 | 日韩欧美精品一区二区三区 | 欧美高清日韩 | 一本伊大人香蕉高清在线观看 | 中文字幕精品在线观看 | 国产高清福利91成人 | 欧美五月婷婷 |