WCF兼容WebAPI输出Json格式数据,从此WCF一举两得

问题起源:

     很多时候为了业务层调用(后台代码),一些公共服务就独立成了WCF,使用起来非常方便,添加服务引用,然后简单配置就可以调用了。

如果这个时候Web站点页面需要调用怎么办呢? 复杂的XML , 使用不方便 ,而且通信成本也比较高。 这时候有人受不了了,

于是就新建了一套WebAPI , Web页面调用爽了。但是维护起来又麻烦了,一会儿WCF , 一会儿WebAPI 一段时间过后,可以想象已经相差甚远了。

某一天同事A , 在业务层需要调用一个接口 ,发现它是WebAPI方式的 ,被迫没办法 , 去写了一个DoRequest(..)的方法来封装调用WebAPI ,

感觉比较痛苦,无端端增加了程序复杂度和工作量,同时还增加程序的风险点。 

问题分析:

  其实就是WCF不能兼容WebAPI输出Json格式数据 , 如果可以写一套接口就搞定了。

  有没有一个办法能让WCF服务又可以在业务层添加服务的方式调用,又可以在网页上通过jQuery调用返回简洁的Json数据呢? 

如何解决:

  WCF可以使用多个Endpoint,能不能再这个上面做文章呢?

  首先,让你的WCF接口支持Web请求,返回Json , 

  引用System.ServiceModel.Web , 下有一个WebGetAttribute 可以帮我们实现:

namespace WCFService
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IWebUser”。
    [ServiceContract]
    public interface IWebUser
    {
        [OperationContract]
        [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/ShowName?name={name}")]
        string ShowName(string name);

        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/ShowNameByPost/{name}")]
        string ShowNameByPost(string name);
    }
}

然后,修改服务配置:

<system.serviceModel>
    
    <services>
      <service name="WCFService.WebUser" behaviorConfiguration="Default">
        /*提供Web HTTP服务用*/
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="WebBehavior" bindingConfiguration="basicTransport" contract="WCFService.IWebUser"/>
        /*提供WCF服务, 注意address='Wcf', 为了区分开与Web HTTP
的地址, 添加引用之后会自动加上的*/     
        <endpoint address="Wcf" binding="basicHttpBinding" contract="WCFService.IWebUser"/>
      </service>
    </services>
    
    <behaviors>      
      <!--WCF中提供了Web HTTP的方式-->
      <endpointBehaviors>
        <behavior name="WebBehavior">
          <webHttp helpEnabled="true"/>
        </behavior>
      </endpointBehaviors>
      <!--WCF中提供了Web HTTP的方式-->

      <serviceBehaviors>        
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>        
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>        
      </serviceBehaviors>
         
    </behaviors>
    
    <bindings>
      <webHttpBinding>
        <binding name="basicTransport"/>
      </webHttpBinding>
    </bindings>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    
  </system.serviceModel>

 Web HTTP Get调用地址:http://ip:port/WebUser.svc/ShowName?name=张三

 Wcf服务地址会变为:http://ip:port/WebUser.svc/Wcf

 这样一来,前台后台的使用方式都不变,从此WCF一举两得,少了重复造轮子的时间与烦恼

 

转载于:https://www.cnblogs.com/li150dan/p/9529335.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值