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一举两得,少了重复造轮子的时间与烦恼

  • 相关阅读:
    vue-cli3.0
    windows服务器的误解
    redis实现消息队列-java代码实现
    Docker 修改容器内的时区
    Spring boot项目分环境Maven打包,动态配置文件,动态配置项目
    rsa公钥和私钥到底哪个才是用来加密,哪个用来解密?
    session和cookie的区别和联系详解,Cookie Session相关看这篇就够了。
    面试中的nginx高可用高并发!
    js正则表达式验证、匹配数字、匹配字符串、匹配中文、匹配任意字符备忘录
    thymeleaf模板、thymeleaf语法相关中文文档教程
  • 原文地址:https://www.cnblogs.com/li150dan/p/9529335.html
Copyright © 2011-2022 走看看