作為今年的應屆畢業生,找工作的壓力確實很大,貌似今年的就業形勢不是特別的好,如果博友們有手機客戶端的職位,請幫我推薦一下,津京地區windows phone,ios,android皆可。
好了,言歸正傳。今天需要總結的是最近學的WCF服務編程,這個是我的畢業設計。因為剛學,如果文中有什么錯誤,還請多多指正。
首先介紹一下,整個應用的業務邏輯。我的畢業設計是一個多客戶端平台的隨機交友應用,起名叫做唔聊,有點類似於omegle.com,就是隨機匹配一些陌生人進行聊天,但是不像陌陌那樣主動去選擇符合條件的用戶,因為性別和頭像總會影響我們的選擇,但在omegle的基礎上加入了用戶信息,依然不帶加好友功能。如果有富余的時間,還會加入一個按照用戶常聊關鍵詞進行匹配的功能,這其中就涉及到了自然語言處理的算法,一時半會兒搞不定。
一本《WCF服務編程》就要700多頁,當一本字典不錯,但是實在看不下去了。后來看了CSDN上老周的WCF系列,感覺比較適合入門在這里推薦一下。http://blog.csdn.net/column/details/wcf-example-come.html
我先說說作為一個入門者,要先從那個地方入手。我們需要了解幾樣比較基本的東西:終結點、契約、宿主、客戶端調用,其他東西可以暫時先不管,知道這三樣,就可以先寫出個東西來了。
終結點(Endpoint):終結點需要了解三樣東西:Address、Binding、Contract,簡稱ABC。
- Address是指服務的Uri地址,
- Binding是綁定方式,綁定方式基本為5種,BasicHttpBinding、NetTcpBinding、NetNamePipeBinding、WSHttpBinding、NetMsmqBinding
- Contract為契約,指向為客戶端提供服務的接口
老周的終結點基本都是用編程方式寫的,所以一下用config的方式來展示一下:
<endpoint address="http://169.254.80.80/WuChatServer/HostSvc.svc" binding="wsHttpBinding" bindingConfiguration="WcfMode.WSHttpBinding" name="HostSvc" contract="WuChatServer.IHost"/>
契約(Contract):WCF定義了四種契約:服務契約、數據契約、錯誤契約、消息契約。契約說白了,就是供客戶端調用的服務,比如客戶端需要調用服務端的加法方法,就定義一個接口,標為服務契約,在接口中的加法方法上標上操作契約。如果需要利用一個數據結構去通信,就用數據契約定義一個結構體,或者一個類。
如下:
[ServiceContract] public interface IService { [OperationContract] int AddMethod(int a,int b); }
public class MyService : IService
{
public int AddMethod(int a, int b)
{
return a + b;
}
}
我為唔聊定義的IHost暫時為這樣的:
[ServiceContract(SessionMode = SessionMode.NotAllowed)] interface IHost { [OperationContract] bool ConnectCumm(string commId);//連接服務,加入在線列表 [OperationContract] bool DisConnectCumm(string commId);//斷開服務 [OperationContract] bool ClientSend(string commId, List<byte[]> msg);//客戶端發送消息 [OperationContract] List<List<byte[]>> GetHostMessage(string id);//獲取服務端消息 [OperationContract] string GetStrangerId(string commId);//獲取聊天對象的id [OperationContract] bool CheckConnect(string id);//檢查是否在線 [OperationContract] string GetChattingNum();//獲取在線人數 [OperationContract] bool GetIsChatting(string commId);//獲取是否為聊天狀態,或者等待狀態 }
宿主(Host):因為WCF服務不能憑空存在,每個WCF服務必須托管在Windows進程中,所以我們必須為WCF服務提供一個宿主。這個宿主可以是asp.net、Winform、WPF、Silverlight等。我在唔聊中暫時用了一個WPF的窗體程序來做為宿主,你可以直接引用WCF的動態庫來實現。
客戶端調用(Client):客戶端如何調用WCF服務是我們比較關心的,作為可以跨平台的服務框架,WCF可利用Restful來提供客戶端調用的方式,通過HTTP的GET、PUT、POST 和 DELETE等方法進行操作。目前唔聊僅實現可在.net客戶端(WPF、windows phone)的一部分功能,所以還是講一下.net的調用方式。
在客戶端的工程上右鍵引用服務
然后點擊發現,可以搜索到同解決方案下的WCF服務,也可以直接輸入WCF服務的地址進行引用。在高級頁面中我們可以選擇是否提供異步的調用方式,WPF客戶端默認為只有同步調用方式,而WP8客戶端為避免程序假死僅提供異步調用方式。
然后在客戶端的ViewModel中編寫代碼:
new HostSvc.HostClient().ConnectCumm(id);//同步 var hostclient = new HostClient.HostClient();//異步 hostclient.ConnectCummCompleted += new EventHandler<HostClient.ConnectCummCompletedEventArgs>(ConnectResult); hostclient.ConnectCummAsync(id); void ConnectResult(object sender, HostClient.ConnectCummCompletedEventArgs e) { }
WP8客戶端如果在調用服務中發生異常,請檢查服務地址是否為localhost,如果是,按此方案解決:http://msdn.microsoft.com/zh-CN/library/windowsphone/develop/jj684580%28v=vs.105%29.aspx
android調用WCF服務可以參見:http://www.cnblogs.com/davidgu/archive/2012/05/16/2504182.html
基本上通過編寫終結點、契約接口、服務宿主、客戶端引用這么幾步,一個WCF服務就算搭建好了。
過兩天我會具體介紹客戶端中的一些故事,稍微講述一下MVVM和android的編程。
分享一張WP8客戶端的設計圖,P的有點水,請見諒吧。
感謝閱讀傾劍飛血的博客
本文地址:http://www.cnblogs.com/jacklandrin/archive/2013/04/20/3033248.html
聯系我:jacklandrin@hotmail.com
本文版權歸作者所有,歡迎轉載,演繹或用於商業目的,但是必須說明本文出處(包含鏈接)。