當咱們寫客戶端《--------》服務端的時候,AB服務端均可以作一樣的工做,經過右鍵添加服務引用的話,拂過作成分佈集羣的話,一兩個服務端無所謂,十個了你得添加十次,二十個你得添加二十次。那麼問題出現了,如何在客戶端動態的根據各個服務器鏈接數自動的負載均衡了。安全
第一步:服務端確定有服務文件,如圖服務器
代碼以下:負載均衡
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WCFService { // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的類名「Service」。 public class Service : IService ,IMyName { public UpFileResult UpLoadFile(UpFile filedata) { UpFileResult result = new UpFileResult(); string path = System.AppDomain.CurrentDomain.BaseDirectory + @"\service\"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } byte[] buffer = new byte[filedata.FileSize]; FileStream fs = new FileStream(path + filedata.FileName, FileMode.Create, FileAccess.Write); int count = 0; while ((count = filedata.FileStream.Read(buffer, 0, buffer.Length)) > 0) { fs.Write(buffer, 0, count); } //清空緩衝區 fs.Flush(); //關閉流 fs.Close(); result.IsSuccess = true; return result; } //下載文件 public DownFileResult DownLoadFile(DownFile filedata) { DownFileResult result = new DownFileResult(); string path = System.AppDomain.CurrentDomain.BaseDirectory + @"\service\" + filedata.FileName; if (!File.Exists(path)) { result.IsSuccess = false; result.FileSize = 0; result.Message = "服務器不存在此文件"; result.FileStream = new MemoryStream(); return result; } Stream ms = new MemoryStream(); FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); fs.CopyTo(ms); ms.Position = 0; //重要,不爲0的話,客戶端讀取有問題 result.IsSuccess = true; result.FileSize = ms.Length; result.FileStream = ms; fs.Flush(); fs.Close(); return result; } public string myname(string str_name) { return string.Format("個人名字是:{0}",str_name); } public string DoWork() { return "付長夢"; } } }
第二步:在客戶端咱們新建兩個接口文件IService、IMyName(我採用的是服務端就是服務端,客戶端是客戶端,分爲兩個解決方案)tcp
using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Text; namespace WCFdny { // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的接口名「IMyName」。 [ServiceContract] public interface IMyName { [OperationContract] string DoWork(); } }
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.ServiceModel; using System.Text; namespace WCFdny { // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的接口名「IService」。 [ServiceContract] public interface IService { //上傳文件 [OperationContract] UpFileResult UpLoadFile(UpFile filestream); //下載文件 [OperationContract] DownFileResult DownLoadFile(DownFile downfile); [OperationContract] string myname(string str_name); } [MessageContract] public class DownFile { [MessageHeader] public string FileName { get; set; } } [MessageContract] public class UpFileResult { [MessageHeader] public bool IsSuccess { get; set; } [MessageHeader] public string Message { get; set; } } [MessageContract] public class UpFile { [MessageHeader] public long FileSize { get; set; } [MessageHeader] public string FileName { get; set; } [MessageBodyMember] public Stream FileStream { get; set; } } [MessageContract] public class DownFileResult { [MessageHeader] public long FileSize { get; set; } [MessageHeader] public bool IsSuccess { get; set; } [MessageHeader] public string Message { get; set; } [MessageBodyMember] public Stream FileStream { get; set; } } }
第三步:客戶端的按鈕實現功能ide
private void button1_Click(object sender, EventArgs e) { string aa = string.Empty; NetTcpBinding bind = new NetTcpBinding();//綁定方式 bind.MaxBufferPoolSize = 2147483647;//最大緩衝 bind.TransferMode = TransferMode.Streamed;//傳輸模式爲流式處理 bind.MaxReceivedMessageSize = 2147483647;//定義了服務端接收Message的最大長度,防止文件過大 bind.Security.Mode = SecurityMode.None;//安全模式設置爲不進行驗證; if (radioButton1.Checked) { EndpointAddress epAddr = new EndpointAddress("net.tcp://127.0.0.1:8081");//此處也能夠用IIS作服務 IMyName proxy = ChannelFactory<IMyName>.CreateChannel(bind, epAddr); aa = "本地WCF" + proxy.DoWork(); } if(radioButton2.Checked) { EndpointAddress epAddr = new EndpointAddress("net.tcp://120.25.160.17:8081");//此處也能夠用IIS作服務 IMyName proxy = ChannelFactory<IMyName>.CreateChannel(bind, epAddr); aa = "服務器WCF" + proxy.DoWork(); } MessageBox.Show(aa); }
第四步:開啓服務端,將服務端分佈在服務器和本地測試一下,結果如圖測試
本地服務端運行截圖spa
服務端運行截圖3d
客戶端運行截圖code