• WCF入门教程(一)简介


    1、WCF是什么?

    WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NET Framework 3.5的重要组成部分。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。

    简单的说:WCF就是分布式通信框架。 

    2、WCF主要构成

    Endpoint

    Endpoint是WCF实现通信的核心要素。一个WCF Service由一个Endpoint集合组成,每个Endpoint就是用于通信的入口,客户端和服务端通过Endpoint交换信息。
    Endpoint由三部分组成:Address,Binding,Contract。便于记忆,我们往往将这三部分称为是WCF的ABC。
    Address

    Address通过一个URI唯一地标识一个Endpoint,并告诉潜在的WCF service的调用者如何找到这个Endpoint。

    Binding

    Binding实现在Client和Service通信的所有底层细节。比如Client与Service之间传递的Message是如何编码的—— text/XML, binary,MTOM;这种Message的传递是采用的哪种Transport——TCP, Http, Named Pipe, MSMQ; 以及采用怎样的机制解决Secure Messaging的问题——SSL,Message Level Security。所以Binding解决的是How to communicate with service?

    Contract

    Contract的主要的作用是定义通信协议,具体Service提供了哪些方法。

    Behavior

    Behavior: Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。比如Service回调Client的Timeout;Client采用的Credential type;以及是否支持Transaction等。

    3、WCF构建流程

    (1)、定义服务协定。 服务协定指定服务的签名、服务交换的数据和其他协定要求的数据
    (2)、实现协定。 若要实现服务协定,请创建实现协定的类并指定运行时应具有的自定义行为。
    (3)、通过指定终结点和其他行为信息来配置服务
    (4)、承载服务
    (5)、生成客户端应用程序。

     

    4、简单实例

     通过最简单的计算器功能来解释具体的实现过程

    1)首先定义契约,这个协议就是定义通信接口

    复制代码
        /// <summary>
        /// 计算协议
        /// </summary>
        [ServiceContract(Namespace = "http://www.yank.com/")]
        public interface ICalculator
        {
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            [OperationContract]
            double Add(double x, double y);
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            [OperationContract]
            double Subtract(double x, double y);
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            [OperationContract]
            double Multiply(double x, double y);
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            [OperationContract]
            double Divide(double x, double y);
        }
    复制代码

    2)通过具体类实现接口功能

    复制代码
        /// <summary>
        /// 计算器具体实现
        /// </summary>
        public class CalculatorService : ICalculator
        {
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public double Add(double x, double y)
            {
                return x + y;
    
            }
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public double Subtract(double x, double y)
            {
                return x - y;
            }
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public double Multiply(double x, double y)
            {
                return x * y;
            }
            /// <summary>
            ////// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public double Divide(double x, double y)
            {
                return x / y;
            }
        }
    复制代码

    3)根据契约(Contract),绑定(Binding)和地址(Address),创建服务节点(ServiceEndPoint)

    4)将服务节点承载在主机(Host)中,例子将host承载在一个控制台程序中。

    复制代码
                #region 采用代码方式实现对契约的绑定
                Uri baseAddress = new Uri("http://127.0.0.1:9999/");
                using (ServiceHost host = new ServiceHost(typeof(CalculatorService), baseAddress))
                {
                    //使用指定的协定、绑定和终结点地址将服务终结点添加到承载服务中
                    host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    #region Behavior
                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/CalculatorService/metadata");
                    host.Description.Behaviors.Add(behavior);
                    #endregion
    
                    host.Opened += delegate
                    {
                        Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                    };
    
                    host.Open();
                    Console.Read();
                }
                #endregion
    复制代码

    5)客户端调用,通过Channel方式调用

    复制代码
    namespace ClientWithChannel
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:9999/CalculatorService"))
                {
                    ICalculator proxy = channelFactory.CreateChannel();
    
                    using (proxy as IDisposable)
                    {
                        Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, proxy.Add(1, 2));
                        Console.WriteLine("x - y = {2} when x = {0} and y = {1}", 1, 2, proxy.Subtract(1, 2));
    
                        Console.WriteLine("x * y = {2} when x = {0} and y = {1}", 1, 2, proxy.Multiply(1, 2));
                        Console.WriteLine("x / y = {2} when x = {0} and y = {1}", 1, 2, proxy.Divide(1, 2));
    
                        Console.ReadLine();
                    }
    
                }
            }
        }
    }
    复制代码

    6)运行Host的Console程序,将服务启动,进行监听,然后启动客户端程序测试调用。

    Host启动

    Client运行结果

     

     5、源码地址:

    http://files.cnblogs.com/yank/WCFServices.zip

  • 相关阅读:
    如何查看MySQL的当前存储引擎?
    避免生产环境执行更新删除语句忘记加where条件的解决方案
    物联网发展的现状
    目前行业内比较流行的开源时序数据库产品
    如何查看端口(3306)被那个程序占用
    MySQL数据库开发的36条军规
    介绍 MySQL 8 中值得关注的新特性和改进。
    IE浏览器 兼容性(IE9-11 差异说明)
    python3:(unicode error) 'utf-8' codec can't decode
    静态代码块
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/3721953.html
Copyright © 2020-2023  润新知