• WCF学习笔记之WCF初识


    这篇博客将介绍WCF的最基础内容,让我们对WCF有一个基本的认识。后续的博客中将会介绍WCF其他方面内容。本篇博客将通过一个简单的例子,介绍如何创建WCF服务,并承载这个服务,让客户端来访问它。下面请看项目结构。

    Client与Hosting是控制台程序,Hosting工程需要添加Contract,Service工程和System.ServiceModel名称空间。Contract工程是类库工程,需要添加System.ServiceModel名称空间,Service工程也是类库工程,需要添加Contract工程引用和System.ServiceModel名称空间。

    在Contract类库中添加ICalculateService接口,

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    
    namespace Contract
    {
        [ServiceContract]
        public interface ICalculateService
        {
            [OperationContract]
            double Add(double x, double y);
    
            [OperationContract]
            double Subtract(double x, double y);
    
            [OperationContract]
            double Divide(double x, double y);
    
            [OperationContract]
            double Multiply(double x, double y);
        }
    }

    在Service类库中新建CalculateService类,实现ICalculateService方法。

    using Contract;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Service
    {
        public class CalculateService : ICalculateService
        {
            public double Add(double x, double y)
            {
                return x + y;
            }
    
            public double Divide(double x, double y)
            {
                return x / y;
            }
    
            public double Multiply(double x, double y)
            {
                return x * y;
            }
    
            public double Subtract(double x, double y)
            {
                return x - y;
            }
        }
    }

    此时WCF服务的契约和实现已经完成了,下面对这个服务进行承载,对WCF的承载有很多种方式,这篇博客介绍通过Console程序和IIS来承载WCF服务。
    1. 通过Hosting控制台程序来承载。需要在配置文件(app.config/web.config)中添加服务的终结点,

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
      <system.serviceModel>
        <services>
          <service name="Service.CalculateService" 
                   behaviorConfiguration="CalculateServiceBehavior">
            <endpoint 
              address="" 
              binding="basicHttpBinding" 
              contract="Contract.ICalculateService">
              <identity>
                <dns value="localhost"/>
              </identity>
            </endpoint>
            
            <endpoint 
              address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange"/>
            <host>
              <baseAddresses>
                <add baseAddress="http://192.168.1.104/CalculateService"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="CalculateServiceBehavior">
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

    承载服务

    using (ServiceHost host = new ServiceHost(typeof(CalculateService)))
    {
        host.Opened += delegate 
        {
            Console.WriteLine("Service is opened.");
        };
    
        host.Open();
    
        Console.ReadKey();
    }

    运行Hosting程序,在浏览器中访问配置文件中服务的地址,

    这就说明我们的服务已经部署成功,下面可以来引用服务,并调用服务公开的方法。

    在Client工程右击选择Add Service References

    输入服务地址,点击Go,可以找到我们已经部署的服务。

    我个人比较喜欢通过SvcUtil命令生成Service的客户端代理类,打开Developer Command prompt for VS2015工具,输入SvcUtil /out:D:CalculateServiceProxy.cs /config:D:app.config http://192.168.1.104/CalculateService

    直接通过命令行方式生成代理类很简洁,也便于在团队开发中控制(个人观点)。

    将生成的CalculateServiceProxy类拷贝到Client工程下Services目录中,替换Client工程中App.config文件内容。下面对服务进行调用,

        using (CalculateServiceClient proxy = new CalculateServiceClient())
        {
            Console.WriteLine(proxy.Add(2,3));
            Console.WriteLine(proxy.Divide(2, 3));
            Console.WriteLine(proxy.Multiply(2, 3));
            Console.WriteLine(proxy.Subtract(2, 3));
    
            Console.ReadKey();
        }

    运行效果如下:

    2. 通过IIS来承载WCF服务,我们只需要做一点点的改变即可,再新建一个类库工程叫IISHosting,引用Contract,Service两个类库,添加一个配置文件叫Web.config, 将上面配置文件的内容复制到Web.config中,删除host节点的内容,再新建一个叫做CalculateService.svc文件,添加如下代码:

    <%@ ServiceHost Service="Service.CalculateService" Language="C#" %>

    编译类库工程,新建一个文件夹叫做CalculateService,将Web.config, CalculateService.svc文件放在里面,另外在文件夹中新建bin文件夹,将编译后Debug目录下Contract.dll, Service.dll拷贝到其中。
    打开IIS控制台,在默认站点下新建一个程序叫做CalculateService,虚拟目录指向新建的CalculateService文件夹地址。

    注意因为我是基于.NET 4.5.2的环境开发的WCF服务,所以请将Application Pool选择为ASP.NET 4.0模式。通过浏览器访问WCF服务,

    服务的调用和上面的控制台承载方式一致。代码点击这里下载。

    感谢您的阅读!

  • 相关阅读:
    【工具基础】google colab的使用
    【CV论文阅读】FoveaBox: Beyond Anchorbased Object Detector研读
    【ubuntu基础】使用清华镜像源更新安装工具
    【ubuntu基础】ubuntu 释放GPU内存
    Ubuntu18.04 rosmelodic opencv版本冲突问题解决
    多传感器标定工具
    pbootcms火车头采集教程(带免登录发布模块)
    家人之间的说话技巧
    pb如何修改授权码
    Spring Boot 异常处理,值得学习!
  • 原文地址:https://www.cnblogs.com/yang-fei/p/5189663.html
Copyright © 2020-2023  润新知