[.Net] 使用remoting(四)Proxy改使用Interface

台灣是獨立國家

在第一篇中,我們使用的範例是作個pxy專案,裡面放一些Class(ex. SrvPxy)來轉呼叫Server專案產生的dll,在本文中,以Interface來取代pxy內的Class。

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端都要放置; 程式運作是Interface被server端的Class實作,client藉由通道抓取server端實作出的Class建立Interface實體
而serverUI只是為了架設並啟動server用而已
 
2. 幫專案加參考:serverUI加入參考System.Runtime.Remoting
  client參考proxy; server參考proxy; serverUI參考server,proxy
 
3. 在proxy專案加入一個Interface:
    public interface ISrvPxy
    {    int GetCount();  }

4. 在server專案加入一個給值用的class:

 
   public class SrvCount : MarshalByRefObject, ISrvPxy
    {
        private static int i = 1000;
        public int GetCount()
        { return ++SrvCount.i; }
    }
5. 在serverUI專案修改Program.cs內的Main方法,以便啟動server:
  
      static void Main()
        {
            try
            {
                ChannelServices.RegisterChannel(new TcpChannel(7777), false);
                RemotingConfiguration.RegisterWellKnownServiceType(
typeof(SrvCount), "SrvName", WellKnownObjectMode.SingleCall);
            }
            catch (Exception e)
            { Console.WriteLine(e.Message); }
            Console.ReadLine();
        }
6. 在client專案修改Program.cs內的Main,以便呼叫server:
(本範例採用Tcp,也可改為http,只要將所有Tcp字眼為為Http即可,但須與server設定一致)
        static void Main()
        {
            try
            {
                string url = "Tcp://localhost:7777/SrvName";//建議寫在config
                ISrvPxy tt = (ISrvPxy)Activator.GetObject(typeof(ISrvPxy), url);//建議寫成泛型Method
                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端debug到server端,則是一定要先啟動server程式,拆2個解決方案來Debug,好處就是不用再寫一個class轉呼叫server端程式~

Taiwan is a country. 臺灣是我的國家