WCF 学习

WCF 学习

一、初识WCF

1、概念:

  • Windows Communication Foundaction(WCF):是微软面向服务(SOA)的应用程序提供的统一编程模型
  • 它是一个面向接口的应用
  • 基本组成(简称ABC)
    • 地址Address:服务的地址
    • 绑定Binding:定义服务的通讯方式(传输协议、编码方案)
    • 契约Contract:定义服务的具体实现
    • 终结点(Endpoint) :有地址、绑定和契约共同构成一个终结点,服务器通过终结点向客户端公开服务,客户端通过终结点调用服务。

2、创建步骤

  • 创建一个空白解决方案

  • 新建一个类库项目

  • 新接一个接口

  • 添加引用 System.ServiceModel

  • 在接口和方法上分别添加两个注解ServiceContract和OperationContract

    namespace WCFServer
    {
        [ServiceContract]
        public interface IFirstWcf
        {
            [OperationContract]
            int Add(int a, int b);
        }
    }
    
  • 新建一个类,实现该接口;

    namespace WCFServer
    {
        public class FirstWcfImpl : IFirstWcf
        {
            public int Add(int a, int b)
            {
                return a + b;
            }
        }
    }
    
  • 已经完成了契约部分,我们需要为服务指定地址及绑定;

  • 新建一个配置文件,比如App.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <!-- 注册服务,name为带命名空间的实现类 -->
          <service name="WCFServer.FirstWcfImpl" behaviorConfiguration="behaviorConfiguration">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/"/>
              </baseAddresses>
            </host>
            <!-- 注册契约 contract 为带命名空间的接口 -->
            <endpoint address="" binding="basicHttpBinding" contract="WCFServer.IFirstWcf"></endpoint>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <!-- 名字和上边Service 的 behaviorConfiguration 名称一样 -->
            <behavior name="behaviorConfiguration">
              <!-- 注册行为,允许get方式请求 -->
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    
  • 新建一个控制台程序,编写启用代码

    static void Main(string[] args)
    {
        using (ServiceHost host = new ServiceHost(typeof(WCFServer.FirstWcfImpl)))
        {
            host.Open();
            Console.WriteLine("服务已启动,按任意键中止...");
            Console.ReadKey(true);
            host.Close();
    
        }
    }
    
  • 启动程序,必须以管理员运行,才能运行成功;

  • 用vs自带的测试工具进行测试。D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\WcfTestClient.exe

3、客户端调用例子

3.1、第一种调用方法 : svcutil

  • 新建一个控制台程序

  • 利用微软的svcutil工具生成FirstService服务的客户端代理类

  • 启动:VS 2017的开发人员命令提示符 ,进入到程序目录,确保服务端已启动,执行命令svcutil http://localhost:8000/?wsdl/o:FirstServiceClient.cs,执行成功后,会生成两个文件output.config和FirstWcfImpl.cs

    -- 进入到新建项目的目录内
    d:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>cd E:\vs_demo\WCFDemo\ConsoleAppClient
    
    d:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>e:
    
    -- 执行如下命令
    E:\vs_demo\WCFDemo\ConsoleAppClient>svcutil http://localhost:8000/?wsdl/o:FirstServiceClient.cs
    Microsoft (R) Service Model Metadata Tool
    [Microsoft (R) Windows (R) Communication Foundation,版本 4.6.1055.0]
    版权所有(C) Microsoft Corporation。保留所有权利。
    
    正在尝试使用 WS-Metadata Exchange 或 DISCO 从“http://localhost:8000/?wsdl/o:FirstServiceClient.cs”下载元数据。
    正在生成文件...
    E:\vs_demo\WCFDemo\ConsoleAppClient\FirstWcfImpl.cs
    E:\vs_demo\WCFDemo\ConsoleAppClient\output.config
    
  • 将output.config修改为App.config

  • Client项目中添加引用,选择System.ServiceModel

  • 编写调用代码

    static void Main(string[] args)
    {
        String key = "";
        while (String.Compare(key, "Q", true) != 0)
        {
            FirstWcfClient client = new FirstWcfClient();
            Console.WriteLine(client.Add(3,5));
            key = Console.ReadLine();
        }
    }
    

3.2、第二种调用方法 : 服务引用

  • 添加服务引用

  • 创建对象,调用方法

    static void Main(string[] args)
    {
        FirstWcf.FirstWcfClient wcf = new ConsoleAppClinent2.FirstWcf.FirstWcfClient();
        int sum = wcf.Add(6,8);
        Console.WriteLine(sum);
        Console.ReadKey();
    }
    

3.3、第三种调用方法 : IIS

  • inetmgr:打开iis

  • 步骤

    • 为WCF服务创建svc文件和IIS虚拟目录

    • 每一个asp.net web服务都有一个.asmx文本文件,客户端通过访问asmx文件实现对web服务的调用。WCF服务也有一个对应的文本文件,后缀为svc,基于IIS的服务寄宿要求相应的wcf服务具有相应的svc文件。

    • 部署于IIS站点中,对wcf服务调用体现在对svc文件的访问上;

    • 新建一个web项目

    • 新建svc文件(新建一个类,修改名字为service.svc ,主要是后缀名的修改)

      <%@ ServiceHost Service="WCFServer.FirstWcfImpl" %>
      
    • web.config配置

      <system.serviceModel>
          <services>
              <service name="WCFServer.FirstWcfImpl">
                  <endpoint binding="basicHttpBinding" contract="WCFServer.IFirstWcf"/>
              </service>
          </services>
          <behaviors>
              <serviceBehaviors>
                  <behavior name="">
                      <serviceMetadata httpGetEnabled="true" />
                      <serviceDebug includeExceptionDetailInFaults="false" />
                  </behavior>
              </serviceBehaviors>
          </behaviors>
          <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
      
posted @ 2022-09-17 17:10  his365  阅读(30)  评论(0编辑  收藏  举报