zoukankan      html  css  js  c++  java
  • WCF(一)

    摘自:http://www.cnblogs.com/yank/p/3653160.html

    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

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/cxzdy/p/3831051.html
Copyright © 2011-2022 走看看