Remoting和Web Service是.net中的重要技術,均可用來實現分佈式系統開發,若是是不一樣的平臺就只能選擇Web Service,但若是是同一平臺,就均可以選擇了。到底選擇那種,固然還有訪問效率上的考慮,同時在Remoting中又有三中信道 Http,Tcp,Ipc,它們又各有差異。HTTP方式的信道在跨越防火牆上有優點;TCP方式的信道經常使用在局域網內通訊,速度比HTTP快很 多;IPC信道用於同一臺機器的進程間通訊,通訊不佔用網絡資源,速度又比TCP快不少。爲了可以實際的比較一下這四者的實際訪問速度,我寫了個小程序用 測試。這個程序的實現很簡單利用Remoting三種信道和Web Service 訪問同一個對象(至關於實際項目中的業務層),而這個對象實現返回系統的時間。就這麼簡單。若是有對Remoting和Web Service不太瞭解的,也能夠經過我這個例子熟悉一下Remoting三種信道的寫法差異和Web Service的調用。小程序
下面是程序運行的界面,我使用.net中的最小時間度量:刻度(用毫秒在本機上可能都很難測出它們之間的差異),來測試每次調用所發的時間,並經過屢次調 用來測的一個平均時間來比較訪問的速度。經過測試能夠看得出他們四者得訪問速度:ipc>tcp>http>Web Service.(其實Remoting的http信道和Web Service的訪問速度還有待比較,跟測試的主機還有必定關係,在我辦公室裏的一臺電腦上好像Web service的訪問速度更快於http信道),你們能夠本身測試一下,或研究一個比較好的方法。網絡
相關代碼:tcp
1 //使用Http信道 2 public void Http() 3 { 4 Stopwatch stopWatch = new Stopwatch(); 5 stopWatch.Start(); 6 MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "http://localhost:9001/MyObject"); 7 myObj.GetServerTime(); 8 stopWatch.Stop(); 9 lsbHttp.Items.Add(stopWatch.ElapsedTicks); 10 } 11 //使用Tcp信道 12 public void Tcp() 13 { 14 Stopwatch stopWatch = new Stopwatch(); 15 stopWatch.Start(); 16 MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "tcp://localhost:9002/MyObject"); 17 myObj.GetServerTime(); 18 stopWatch.Stop(); 19 lsbTcp.Items.Add(stopWatch.ElapsedTicks); 20 } 21 //使用Ipc信道 22 public void Ipc() 23 { 24 Stopwatch stopWatch = new Stopwatch(); 25 stopWatch.Start(); 26 MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "Ipc://MyHost/MyObject"); 27 myObj.GetServerTime(); 28 stopWatch.Stop(); 29 lsbIpc.Items.Add(stopWatch.ElapsedTicks); 30 } 31 32 //訪問Web Service 33 public void WebService() 34 { 35 Stopwatch stopWatch = new Stopwatch(); 36 stopWatch.Start(); 37 localhost.Service ws = new localhost.Service(); 38 ws.GetServerTime(); 39 stopWatch.Stop(); 40 lsbWeb.Items.Add(stopWatch.ElapsedTicks); 41 } 42 private void btnHttp_Click(object sender, EventArgs e) 43 { 44 Http(); 45 } 46 47 private void btnTcp_Click(object sender, EventArgs e) 48 { 49 Tcp(); 50 } 51 52 private void btnWebService_Click(object sender, EventArgs e) 53 { 54 WebService(); 55 } 56 57 private void btnIpc_Click(object sender, EventArgs e) 58 { 59 Ipc(); 60 } 61 62 //開始測試 63 private void btnStat_Click(object sender, EventArgs e) 64 { 65 Int32 Times = int.Parse(txtTimes.Text); 66 Int64 Sum = 0; 67 double Ave=0; 68 lsbHttp.Items.Clear(); 69 lsbIpc.Items.Clear(); 70 lsbTcp.Items.Clear(); 71 lsbWeb.Items.Clear(); 72 73 for (Int32 i = 0; i < Times; i++) 74 { 75 Http(); 76 Tcp(); 77 Ipc(); 78 WebService(); 79 } 80 //計算平均時間 81 for(Int32 i=0;i<Times;i++) 82 { 83 Sum += int.Parse(lsbHttp.Items[i].ToString ()); 84 } 85 Ave = Sum / Times; 86 txtHttp.Text = Ave.ToString(); 87 88 Sum = 0; 89 for (Int32 i = 0; i < Times; i++) 90 { 91 Sum += int.Parse(lsbTcp.Items[i].ToString()); 92 } 93 Ave = Sum / Times; 94 txtTcp.Text = Ave.ToString(); 95 96 Sum = 0; 97 for (Int32 i = 0; i < Times; i++) 98 { 99 Sum += int.Parse(lsbWeb.Items[i].ToString()); 100 } 101 Ave = Sum / Times; 102 txtWebService.Text = Ave.ToString(); 103 104 Sum = 0; 105 for (Int32 i = 0; i < Times; i++) 106 { 107 Sum += int.Parse(lsbIpc.Items[i].ToString()); 108 } 109 Ave = Sum / Times; 110 txtIpc.Text = Ave.ToString(); 111 } 112 HttpChannel httpChannel = new HttpChannel(9001); 113 ChannelServices.RegisterChannel(httpChannel,false ); 114 115 TcpChannel tcpChannel = new TcpChannel(9002); 116 ChannelServices.RegisterChannel(tcpChannel,false ); 117 118 IpcChannel ipcChannel = new IpcChannel("MyHost"); 119 ChannelServices.RegisterChannel(ipcChannel,false ); 120 121 RemotingConfiguration .RegisterWellKnownServiceType (typeof (RemoteObject .MyObject ),"MyObject",WellKnownObjectMode.SingleCall); 122 Console.ReadLine();