基於WCF的API實現


本文程序基於VS2013、EF6.1、WCF

WCF有2種方式,一是SOAP,一種是Restful

由於程序是基於PCL(可移植類庫)的,所以不能用直接引入WCF服務的方式

網上的Restful方式的文章也有一些,但是都沒有解決我的問題,最終還是在stackoverflow上找到了解決方法

言歸正傳,先看下代碼結構(本人也是第一次用,結構可能不好,歡迎一起交流)

 

Client是用來測試的客戶端,沒什么,可以忽略

Contracts不用說就是契約了

Services是實現契約

Entity是EF實體框架

HostingService是用Windows service 做的宿主服務

一、Contracts

對契約的分類理解不深,所以大概寫了一下,直接看詳細代碼

1 [ServiceContract]
2     public interface IBoardService
3     {
4         [OperationContract]
5         [WebInvoke(Method = "POST", UriTemplate = "getConfigData/{email}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
6         string GetConfigData(string email);
7     }


這里指明了是要POST請求,如果要Get,就把WebInvoke 換成WebGet

二、Services

1 public class BoardService : IBoardService
2     {
3         public string GetConfigData(string email)
4         {
5             return "successed";
6         }
7     }

這樣寫完你在調用的時候會提示 AddressFilter 和 EndpointDispatcher 不匹配,我搜到的也就到這了,這也是困擾了我好久的問題

最終在http://stackoverflow.com/questions/6919768/rest-wcf-service 找到了答案

在類上邊加上 [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

然后果然變化了,錯誤變為 ContractFilter 和 EndpointDispatcher 不匹配,不用擔心,到這就說明WCF部分OK了

三、HostingService

到這就是關鍵的App.config了,配置對了,就可以Post到了,具體如下

 1   <system.serviceModel>
 2     <bindings>
 3       <webHttpBinding>
 4         <binding name="boardServiceBinding">
 5           <security mode="None"/>
 6         </binding>
 7       </webHttpBinding>
 8     </bindings>
 9 
10     <protocolMapping>
11       <add scheme="webHttp" binding="webHttpBinding" />
12     </protocolMapping>
13 
14     <behaviors>
15       <serviceBehaviors>
16         <behavior name="BoardBehavior">
17           <serviceMetadata httpGetEnabled="true" />
18           <serviceDebug includeExceptionDetailInFaults="false" />
19         </behavior>
20       </serviceBehaviors>
21 
22       <endpointBehaviors>
23         <behavior name="REST">
24           <webHttp />
25         </behavior>
26       </endpointBehaviors>
27     </behaviors>
28 
29     <services>
30       <service behaviorConfiguration="BoardBehavior" name="BoardServices.Services.BoardService">
31         <endpoint address="" behaviorConfiguration="REST" binding="webHttpBinding"
32           contract="BoardContracts.ServiceContract.IBoardService">
33           <identity>
34             <dns value="localhost" />
35           </identity>
36         </endpoint>
37         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
38         <host>
39           <baseAddresses>
40             <add baseAddress="http://127.0.0.1:8080/BoardService" />
41           </baseAddresses>
42         </host>
43       </service>
44           </services>
45   </system.serviceModel>

請注意endpointBehaviors 和 endpoint的寫法

到此Post服務就基本OK了

四、Entity

順便說下Entity吧,在這里我用了Code First,至於3種First的區別,請Google 去吧,在此不做討論

首先的問題是Entity我也熟悉,完全描述清楚表之間的關系不容易

於是發現VS2013有一個從數據庫導入的Code First模式,SQL SERVER會用吧,那就先建表吧,然后導入就OK了

此處我想不用圖片了吧,EF的導入真的很簡單

 

代碼等回家再上傳吧,里邊真的挺亂的,大家就找到自己需要的部分就好了

代碼地址:http://pan.baidu.com/s/1bntlLoF


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM