Remoting的承載方式是這樣的

javaprogramers發表於2006-05-14
在實際的應用中我們通常只會選擇用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>

執行程式,我們得到的是一個省市的列表:


一、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

相關文章