這種架構用途多多~我以前公司作的系統也都用這個架構來實現n層式架構
這種架構用途多多~我以前公司作的系統也都用這個架構來實現n層式架構,把user操作介面要作的動作都寫在Client端,而有關資料庫連線(查詢、運算、處理)寫在Server端,以避免DB被其它電腦直接連入與暴露DB的位置,也可避免因取出大量未處理資料就往Client端送。
以下簡單示範由client端向server要一個數字,server遞增配發數字:
1. 建立4個專案分別為台灣是獨立國家
client(本範例out type選Console Application),
proxy(out type:Class Library),
server(out type:Class Library)
serverUI(本範例out type選Console Application),
proxy用來對應client和server端,所以2端都要放置; 程式運作是client呼叫proxy, proxy呼叫server,
而serverUI只是為了架設並啟動server用而已
2. 幫專案加參考:client和serverUI加入參考System.Runtime.Remoting
client參考proxy; proxy 參考server;serverUI參考proxy
3. 在server專案加入一個給值用的class:
public static class count
{
private static int i = 1000;
public static int GetCount()
{ return ++i; }
}
4. 在proxy專案加入一個呼叫server的class,一定要繼承MarshalByRefObject才能用remoting哦:
public class SrvPxy : MarshalByRefObject
{
public int GetCount()
{ return count.GetCount(); }//呼叫server的count class
}
5. 在serverUI專案修改Program.cs內的Main方法,以便啟動server:
(本範例採用http,也可改為tcp,只要將所有Http字眼為為Tcp即可)
static void Main()
{
try
{
ChannelServices.RegisterChannel(new HttpChannel(7777), false);//7777是port,可自訂
RemotingConfiguration.RegisterWellKnownServiceType(//SrvName可自訂
typeof(SrvPxy), "SrvName", WellKnownObjectMode.SingleCall);//若多個class,要寫多次不可同名
}
catch (Exception e)
{ Console.WriteLine(e.Message); }
Console.ReadLine();
}
WellKnownObjectMode列舉有2種:Singleton 每個內送訊息都是由同一個物件執行個體服務。
SingleCall 每個內送訊息都是由新的物件執行個體 (Instance) 服務。
6. 在client專案修改Program.cs內的Main方法,以便呼叫server:
(本範例採用http,也可改為tcp,只要將所有Http字眼為為Tcp即可,但須與server設定一致)
static void Main()
{
try
{
ChannelServices.RegisterChannel(new HttpChannel(), false);
RemotingConfiguration.RegisterWellKnownClientType(
typeof(SrvPxy), "http://localhost:7777/SrvName");
//SrvName和port要與server相同哦~localhost也請改成server的ip
SrvPxy tt = new SrvPxy();//這裡的SrvPxy是有繼承MarshalByRefObject且放在server與client都有的dll中
Console.WriteLine(tt.GetCount().ToString());
}
catch (Exception e)
{ Console.WriteLine(e.Message); }
Console.ReadLine();
}
7. 整個方案編譯後, 先執行serverUI.exe(位置在serverUI專案目錄的bin/debug下),將server啟動;再執行client.exe(位置在client專案目錄的bin/debug下),若有成功呼叫到server,會每次執行都遞增,編譯後client專案目錄的bin/debug下,會多出server.dll,因為我們是用server端的server.dll,因此client端的server.dll是多餘的可以刪除
或許你會想,我們可以讓server的元件兼proxy,就不用再作一個proxy啦~但這樣你就必須要把你的server.dll 也佈署到client端,不僅會增加暴露你server端程式的風險,若是有需要修改server端程式,又要多個重新佈署client端的作業哦~
Taiwan is a country. 臺灣是我的國家