設計原則:萬物皆對象 背景:微軟提供了一套強大的通信框架Wcf,瞭解請看百度百科:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdin 雖然這套通信框架很強大,但是配置起來也不簡單,因此導致很多人望而卻步(包括我),我這人向來不喜歡麻煩,喜歡簡單,最好 ...
設計原則:萬物皆對象
背景:微軟提供了一套強大的通信框架Wcf,瞭解請看百度百科:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdin
雖然這套通信框架很強大,但是配置起來也不簡單,因此導致很多人望而卻步(包括我),我這人向來不喜歡麻煩,喜歡簡單,最好就是給我一個對象,告訴我怎麼傳參就使用是最爽的,我相信應該有很多人跟我一樣的想法,因此,這篇文章應運而生,沒錯,就是零配置使用Wcf,下麵我會詳細道來。
正文:
1、核心類庫,註意,需要引用程式集
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 } }
2、服務端使用:
服務介面定義:
IService.cs
using System.ServiceModel; namespace _01.WcfServer { /// <summary> /// 對外提供的介面規範,必須要ServiceContract特性 /// </summary> [ServiceContract] public interface IService { /// <summary> /// 對外提供的介面方法,必須OperationContract特性,方法不能重載 /// </summary> /// <returns></returns> [OperationContract] string Hello(); } }
服務介面實現:
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(); } } }
詳細使用步驟:
1、運行Wcf服務端,必須以管理員許可權
2、打開瀏覽器,測試Wcf是否成功開啟
3、客戶端引用服務
右鍵引用,引用服務,輸入服務地址(即Wcf初始化時第二個參數)
3、客戶端代碼調用
2、客戶端成功運行
總結:
全程實現真正的0配置搭建了Wcf服務,滿不滿意,意不意外,驚不驚喜,爽不爽~~
最後,慣例,全部代碼代碼在GitHub,歡迎大家點贊~
https://github.com/Coldairarrow/Wcf