• WCF学习笔记


      首先,先简单了解一下什么是WCF(Window Communication Foundation),是微软为构建面向服务的应用程序所提供的统一编程模型,能够解决不同应用程序域,不同平台之间的通信问题。WCF统一了多重分布式技术:Webservice、.NetRemoting、.Net企业服务、微软的消息队列(MSMQ)。一个WCF有几个基本概念必须要了解的,

    契约(ServiceContract):契约是属于一个服务公开的公共接口,定义了服务端公开的服务方法、使用的传输协议、可访问的地址以及传输的消息格式等。既契约告诉我们能干什么。

    地址(Address):在WCF框架中,每个服务都具有唯一的地址,其他服务或者客户端通过这个地址可以访问到这个服务。

    绑定(Binding):绑定定义了服务与外部通信的方式。它由一组称为绑定元素的元素而构成,这些元素组合在一起形成通信基础结构。

    终结点(EndPoint):终结点是用来发送或接收消息(或同时执行这两种操作)的构造。一个终节点由三个要素组成,分别是:地址、绑定和契约。

    宿主(Host):WCF服务必须承载于某个进程中。宿主是控制服务的生存期的应用程序。

      了解了WCF的一些基本概念后,接下来去搭一个简单的WCF服务,首先定义一个接口:

     [ServiceContract]//在接口上声明ServiceContract特性,表示这个是一个契约
        public  interface  IWCFDemo
        {
            [OperationContract]//在方法上声明OperationContract表示该方法是一个对外的服务
            int Add(int a,int b);
            [OperationContract]
            int  Del(int a,int b);
    
            string GetTime();//此方法未被声明是一个对外的服务
        }

      上面的代码中,接口上打上ServiceContract,在这需要添加ServiceContract的引用,在System.ServiceModel程序集下,表示该接口是一个契约,在方法上声明OperationContract,表示该方法是一个对外的服务,远程客户端可以调用的到该方法,其中string GetTime();未被声明OperationContract,这个方法不对外公布。

      然后是添加服务去实现IWCFDemo这个接口

     public class WCFDemo : IWCFDemo//实现IWCFDemo接口
        {
    
            public int IWCFDemo.Add(int a, int b)
            {
                return a + b;
            }
    
            public int IWCFDemo.Del(int a, int b)
            {
                return a - b;
            }
    
            public string IWCFDemo.GetTime()
            {
                return DateTime.Now.ToString();
            }
        }

      好了至此,我们已经把一个WCF的服务给创建好了,接下来是要将这个服务承载于宿主中。和为这个服务分配一个访问的地址。这时,需要新建一个App.config配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
      <system.serviceModel>
        <services>
          <!--配置一个服务(注意:这里可以配置多个服务)-->
          <service name="BLL.WCFDemo" behaviorConfiguration="behaviorConfiguration">
            <!--name为服务的名称,behaviorConfiguration给这个服务定义一些行为-->
            <host>
              <baseAddresses>
                <add baseAddress="http://127.0.0.1:8090/"/><!--服务的访问地址-->
              </baseAddresses>
            </host>
            <!--终结点由地址,绑定,契约-->
            <endpoint address="" binding="basicHttpBinding" contract="IBLL.IWCFDemo">
            </endpoint>
          </service>
    
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="behaviorConfiguration">
              <serviceMetadata httpGetEnabled="true"/><!--给behaviorConfiguration定义一些行为-->
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

      接下来是为这个服务提供一个运行的宿主,通过该宿主程序来启动我们的服务。这里可以使用控制台程序,winform程序。在这,使用了控制台程序

    ServiceHost  host=new ServiceHost(typeof(WCFDemo));//将服务寄宿在宿主中
                host.Open();//运行
                Console.WriteLine("服务已启动、、、");
                Console.ReadKey(true);
                host.Close();关闭

      好了,到了这一步我们就可以测试一下能不能调用得到服务,先是启动宿主,让服务在宿主中运行

      然后打开WCF测试客户端,在VS的安装目录下~Microsoft Visual Studio 11.0Common7IDE目录下的WcfTestClient.exe,在文件->添加服务中,将服务的地址输入进去,这时就可以看到正在运行的服务,我们发现,只有Add()与Del(),两个方法,而GetTime()由于没有声明为对外的服务,在这是无法调用的到。

    在双击某一个服务时在右边的窗口,会出现一个可以调用该服务的窗口

      上面的方法是用自带的WCF客户端测试工具测试,如果需要自己模拟一个客户端去测试的话会比较麻烦一点,下面详细的介绍一下如何去模拟客户端来测试WCF服务。在这我用控制台应用程序来做测试。首先新建一个客户端Client控制台应用程序。

      然后是启动vs开发人员命令提示,执行“cd:E:c#项目WCFDemo”-->"E:"定位到项目的解决方案的目录下,启动WCF的宿主服务,执行“svcutil http://localhost:8090/?wsdl /o:WCFDemoClient.cs”

      将生成的WCFDemoClient.cs与output.config文件添加到新建的Client控制台的应用程序中,并把output.config文件名改为App.cinfig。在主程序中去调用WCF服务

    static void Main(string[] args)
            {
                WCFDemoClient client = new WCFDemoClient();
                Console.WriteLine(client.Add(2, 3));
                Console.ReadKey();
            }

      调试时将宿主程序运行起来,然后启动客户端的程序,当我们调用Add()这个函数时,控制台输出的结果为5,表示我们已经调用了这个服务

      至此,一个简单的WCF服务的Demo已经基本完成,当一个程序中有许多不同的服务,可以将不同的服务绑定不同的地址对外发布,服务端就可以调用得到对外发布的服务,可以轻松的做到集群,并且其中一个服务出现问题,而不影响其他的服务,降低耦合度,便于维护。

  • 相关阅读:
    【postman】api开发必备神器
    【Nginx】Nginx服务器配置调优
    转:【微信公众号】微信snsapi_base静默授权与snsapi_userinfo网页授权的实现(不建议使用静默,直接用主动比较方便)
    【vue2.X+iview2.x】iView在非 template/render 模式下标签的转化
    【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题
    【Redis】Redis事务详解,Redis事务支持回滚(不支持悲观锁)
    java 为什么有时一个类有多个构造函数
    一个普通类如何不实现一个接口的所有方法
    Groovy 安全导航(safe-navigation)操作符(?.)
    java 中的 ?: 埃尔维斯操作符
  • 原文地址:https://www.cnblogs.com/Opiece/p/4824838.html
Copyright © 2020-2023  润新知