zoukankan      html  css  js  c++  java
  • 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一举两得,少了重复造轮子的时间与烦恼

  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/li150dan/p/9529335.html
Copyright © 2011-2022 走看看