• 热门专题

WCF的Restful服务实现Post请求

作者:Blue-Geng  发布日期:2014-09-29 20:17:40
  • 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的导入真的很简单

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

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

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规