首页 > 代码库 > WCF的Restful服务实现Post请求

WCF的Restful服务实现Post请求

本文程序基于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 IBoardService3     {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 : IBoardService2     {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=http://www.mamicode.com/"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的导入真的很简单

 

代码等回家再上传吧,里边真的挺乱的,大家就找到自己需要的部分就好了

发个GitHub地址,大家自行下载吧https://github.com/heyixiaoran/BoardService2

WCF的Restful服务实现Post请求