Remoting的承載方式是這樣的
在實際的應用中我們通常只會選擇用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
可能大家會覺得這個過程將是一個複雜的過程,其實不然,下面說一下實現方法,步驟非常少。
先來建立遠端物件
客戶端仍然是一個控制檯來進行測試:
服務端配置檔案:
執行程式,我們得到的是一個省市的列表:
一、windows服務承載
用vs.net製作一個windows服務的過程基本不超過10個步驟,所以我們不需要害怕。
1、建立一個新的windows服務專案RemoteServer1
2、開啟Service1程式碼檢視,找到OnStart部分,加入程式碼
(不要遺漏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、修改客戶端程式碼,直接例項化遠端物件
等到正式部署的時候我們還原資料庫連線字串從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
在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;
}
}
}
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();
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>
<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");
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();
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
相關文章
- 招程式設計師的最佳方式是這樣的?程式設計師
- [JS]繼承的這6種方式!(上)JS繼承
- [JS]繼承的這6種方式!(下)JS繼承
- RemotingIIS承載方式REM
- 在java的繼承中你是否有這樣的疑惑?Java繼承
- 我是這樣理解EventLoop的OOP
- javascript繼承的方式JavaScript繼承
- 不一樣的圖片載入方式
- 大牛的程式碼是這樣寫的
- 微軟出的手錶是這樣的!微軟
- 原來你是這樣的FlutterFlutter
- 原來你是這樣的switch~
- React Ref 其實是這樣的React
- 我是這樣學習前端的前端
- 原來你是這樣的PromisePromise
- 原來你是這樣的GitGit
- ES6繼承和ES5繼承是完全一樣的麼?繼承
- 繼承的實現方式繼承
- 記不住的繼承方式繼承
- JavaScript 中的原型原來是這樣的JavaScript原型
- 這是奧運史上首次由雲端計算替代傳統 IT,承載奧運的組織
- sendredirect()方法是什麼樣的請求方式?
- 原來JavaScript是這樣執行的JavaScript
- 你知道的反射是這樣嗎?(二)反射
- 我是這樣理解DAO的,對嗎?
- 原來Stable Diffusion是這樣工作的
- Remoting服務端和客戶端程式該這樣模式來寫REM服務端客戶端模式
- 在繼承當中這些方法及程式碼塊執行順序是什麼樣的繼承
- 這樣理解,java繼承中多型的屬性和方法Java繼承多型
- topthink 這樣的小組是怎麼做的
- CSS的繼承和使用方式CSS繼承
- JavaScript的幾種繼承方式JavaScript繼承
- JavaScript實現繼承的方式JavaScript繼承
- 豌豆莢的員工工作方式是什麼樣的?
- 原來CNN是這樣提取影像特徵的。。。CNN特徵
- 原來你是這樣的http2......HTTP
- Fundebug是這樣備份資料的
- 路由器你竟然是這樣的...路由器