設計原則:萬物皆對象git
背景:微軟提供了一套強大的通訊框架Wcf,瞭解請看百度百科:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdingithub
雖然這套通訊框架很強大,可是配置起來也不簡單,所以致使不少人望而卻步(包括我),我這人向來不喜歡麻煩,喜歡簡單,最好就是給我一個對象,告訴我怎麼傳參就使用是最爽的,我相信應該有不少人跟我同樣的想法,所以,這篇文章應運而生,沒錯,就是零配置使用Wcf,下面我會詳細道來。瀏覽器
正文:服務器
一、核心類庫,注意,須要引用程序集框架
System.ServiceModel
WcfHost.cs函數
using System; using System.ServiceModel; using System.ServiceModel.Description; using System.Threading.Tasks; namespace Coldairarrow.Util.Wcf { /// <summary> /// Wcf服務代碼控制類(必須開啓管理員權限) /// </summary> /// <typeparam name="Service">服務處理</typeparam> /// <typeparam name="IService">服務接口</typeparam> public class WcfHost<Service,IService> { #region 構造函數 /// <summary> /// 構造函數 /// </summary> /// <param name="baseUrl">http基地址(服務器真實地址),默認爲:http://127.0.0.1:14725/ </param> /// <param name="httpGetUrl">http獲取服務引用的地址(服務器真實地址),默認爲:http://127.0.0.1:14725/mex </param> public WcfHost(string baseUrl= "http://127.0.0.1:14725/", string httpGetUrl= "http://127.0.0.1:14725/mex") { _serviceHost = new ServiceHost(typeof(Service), new Uri(baseUrl)); //ServiceEndPoint 終結點 包含Address地址 Binding綁定 Contracts契約 簡稱ABC _serviceHost.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), typeof(Service).Name); //添加服務終結點 if (_serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>() == null) { //判斷是否在配置文件中定義了元數據終結點 ServiceMetadataBehavior metaData = new ServiceMetadataBehavior(); metaData.HttpGetEnabled = true; metaData.HttpGetUrl = new Uri(httpGetUrl); _serviceHost.Description.Behaviors.Add(metaData);//添加元數據終結點 } } #endregion #region 私有成員 private ServiceHost _serviceHost; #endregion #region 外部接口 /// <summary> /// 開始Wcf服務 /// </summary> public void StartHost() { Task task = new Task(() => { try { if (HandleHostOpened != null) _serviceHost.Opened += new EventHandler(HandleHostOpened); if (_serviceHost.State != CommunicationState.Opened) { _serviceHost.Open(); } } catch (Exception ex) { HandleException?.Invoke(ex); } }); task.Start(); } #endregion #region 事件處理 /// <summary> /// 當Wcf服務開啓後執行 /// </summary> public Action<object, EventArgs> HandleHostOpened { get; set; } /// <summary> /// 異常處理 /// </summary> public Action<Exception> HandleException { get; set; } #endregion } }
二、服務端使用:測試
服務接口定義:網站
IService.csui
using System.ServiceModel; namespace _01.WcfServer { /// <summary> /// 對外提供的接口規範,必需要ServiceContract特性 /// </summary> [ServiceContract] public interface IService { /// <summary> /// 對外提供的接口方法,必須OperationContract特性,方法不能重載 /// </summary> /// <returns></returns> [OperationContract] string Hello(); } }
服務接口實現:spa
Service.cs
namespace _01.WcfServer { /// <summary> /// 接口具體實現類 /// </summary> public class Service : IService { /// <summary> /// 方法具體實現 /// </summary> /// <returns></returns> public string Hello() { return "Hello World"; } } }
服務端運行:注意,必須以管理員權限運行
Program.cs
using Coldairarrow.Util.Wcf; using System; namespace _01.WcfServer { class Program { static void Main(string[] args) { //建立Wcf服務對象,泛型參數Service爲實現類,IService爲服務接口 //第一個參數baseUrl爲服務基地址(必須爲真實地址) //第二個參數httpGetUrl爲服務引用地址(必須爲真實地址),也就是客戶端添加服務引用時用的地址 WcfHost<Service, IService> wcfHost = new WcfHost<Service, IService>("http://localhost:14725", "http://localhost:14725/mex"); //當Wcf服務開啓後執行的事件 wcfHost.HandleHostOpened = new Action<object, EventArgs>((obj, tar) => { Console.WriteLine("服務已啓動!"); }); //開始Wcf服務 wcfHost.StartHost(); while(Console.ReadLine()!="quit") { } } } }
客戶端使用:
Program.cs
using System; namespace _02.WcfClient { class Program { static void Main(string[] args) { //ServiceReference1爲引用時自定義的命名空間 //ServiceClient爲具體實現類,Service爲類名,Client爲後綴 //能夠在不少地方使用,好比控制檯,Winform,ASP.NET網站等,把它當作一個類庫就很好理解了66666 ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient(); //調用Service提供的Hello方法,Wcf服務端必須運行 var data = client.Hello(); Console.WriteLine(data); Console.ReadKey(); } } }
詳細使用步驟:
一、運行Wcf服務端,必須以管理員權限
二、打開瀏覽器,測試Wcf是否成功開啓
三、客戶端引用服務
右鍵引用,引用服務,輸入服務地址(即Wcf初始化時第二個參數)
三、客戶端代碼調用
二、客戶端成功運行
總結:
全程實現真正的0配置搭建了Wcf服務,滿不滿意,意不意外,驚不驚喜,爽不爽~~
最後,慣例,所有代碼代碼在GitHub,歡迎你們點贊~