• WCF技术剖析_学习笔记之一


    本系列适合新手,从0学起。共同学习,共同探讨。

    基础概念

    SOA:就是采用Web服务的架构

    它有一些特性,需要了解:

    1、自治的:不依赖于访问它的客户端和其他服务,可以独立的进行部署和实施版本策略和安全策略。

    2、依赖于开放的标准:让不同的厂商开发的服务能够进行互操作。

    3、支持跨平台

    4、鼓励创建可组合的服务

    5、鼓励服务的复用

    6、强调松耦合:契约的实现

    WCF应用实例,帮助理解WCF服务的基本结构

    过程:

    1、构建解决方案

    Contracts:定义服务的契约(接口部分)

    Services:定义服务的实现(具体逻辑实现)

    Hostiing:宿主

    另外还有一个是客户端,位于独立的解决方案中

    Client

    具体如下图所示:

    2、创建服务契约

    wcf包含四种契约:服务契约,数据契约,消息契约和错误契约。这里介绍第一种。

    服务契约
    using System;
    using System.ServiceModel;//WCF框架的绝大部分实现和API定义在该程序集中
    
    namespace YH.WCFServices.Contracts
    {
        /// <summary>
        /// 定义服务契约
        /// </summary>
        [ServiceContract(Name="CalculatorBervice",Namespace="http://www.aoyou.com/")]//作用是显式的声明该接口为服务契约
        public interface ICalculator
        {
            //成员方法并不能自动成为服务的操作,需要显示应用特性
            [OperationContract]
            double Add(double x, double y);
    
            [OperationContract]
            double Subtract(double x, double y);
        }
    }

    3、实现服务

    服务的具体实现
    using System;
    using YH.WCFServices.Contracts;
    
    namespace YH.WCFServices.Services
    {
        /// <summary>
        /// 服务的实现
        /// </summary>
        public class CalculatorService:ICalculator
        {
            public  double Add(double x, double y)
            {
                return x + y;
            }
            public double Subtract(double x, double y)
            {
                return x - y;
            }
        }
    }

    4、寄宿
    (1)编码方式自我寄宿

    自我寄宿
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using YH.WCFServices.Contracts;
    using YH.WCFServices.Services;
    
    namespace YCH.WCFServices.Hostiing
    {
        class Program
        {
            static void Main(string[] args)
            {
                //提供服务寄宿的主机ServiceHost
                using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
                {
                    //终结点=ABC【地址、绑定、契约】
                    //地址:决定服务的地址、解决服务的寻址问题
                    //绑定:绑定实现了通信的所有细节,包括网络传输、消息编码、以及其他为实现某种功能(比如安全、可靠传输、事务等,对消息进行的相应处理)
                    //提供的系统定义绑定:BasicHttpBinding、WsHttpBinding、NetTcpBinding等
                    //契约:对服务操作的抽象、也是对消息交换模式和消息结构的定义
                    host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:9999/calculatorservice/metadata");
                    if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                    {
                        //元数据的发布通过一个特殊的服务行为ServiceMetadataBehavior来实现
                        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                        behavior.HttpGetEnabled = true;
                        behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/calculatorservice/metadata");
                        host.Description.Behaviors.Add(behavior);
                    }
                    host.Opened += delegate
                    {
                        Console.WriteLine("CalculaorService已启动,按任意键终结");
                    };
                    host.Open();
                    Console.Read();
                }
            }
        }
    }

    WCF服务寄宿通过ServiceHost对象完成。请注意构造函数参数,是基于服务的类型(而不是契约的类型)
    if块里面的可省略。这里定义的是服务的描述,这里面代码作用是:因为实现了松耦合,WCF应用中,客户端只需了解WCF服务的基本描述,无需知道具体实现细节。

    描述是通过元数据形式发布的。这个通过ServiceMetadataBehavior来实现。这里采用了HTTP-GET的元数据获取方式,发布地址通过HttpGetUrl指定。

    获取相关元数据,可以在浏览器中键入http://127.0.0.1:9999/calculatorservice/metadata,以WSDL形式展示。

    ServiceHost的Open方法对服务成功寄宿。

    (2)配置文件方式自我寄宿

     VS的工具里提供【WCF服务配置编辑器】,有向导,可以尝试下。

    如果生成了配置文件,就可以直接读取之。

    寄宿服务代码
    using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
                {
                    host.Opened += delegate
                    {
                        Console.WriteLine("CalculatorService已启动");
                    };
                    host.Open();
                    Console.Read();
                }

    以上,其实也就是省略了指定终结点信息(ABC)的过程。

    5、可以创建客户端调用服务了

    这个主要是在VS中操作,添加服务,VS会自动生成一系列用于服务调用的代码和配置。

    代码:

    Client代码
    using System;
    using WCFModel_1.CalculatorService;
    
    namespace WCFModel_1
    {
        class Program
        {
            static void Main(string[] args)
            {
                CalculatorBerviceClient client = new CalculatorBerviceClient();
                client.Add(2, 3);
            }
        }
    }

    客户端通过服务代理对象进行服务的调用。即通过创建自动生成的、继承自ClientBase<T>的类型对象进行服务调用的。

    6、通过IIS寄宿服务

    (1)为服务创建.svc文件

    .svc文件,是一个文本文件,仅仅包含一个ServiceHost指令,该指令鱼油一个必须的Service属性(指明了相应的WCF服务的有效类型)和一些可选的属性。

    (2)为WCF服务创建虚拟目录

    这个书上并未讲怎么生成.svc文件,所以导致实验不能继续。待研究明白后继续补充。

  • 相关阅读:
    javascript页面刷新的几种方法
    Expo大作战(三十九)--expo sdk api之 DocumentPicker,Contacts(获取手机联系人信息),Branch
    Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
    Expo大作战(三十七)--expo sdk api之 GLView,GestureHandler,Font,Fingerprint,DeviceMotion,Brightness
    Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera
    Expo大作战(三十五)--expo sdk api之Location!
    一条SQL语句中算日销售额和月销售额
    绑定sql server数据库的用户与登录名
    牛腩代码生成器
    ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫
  • 原文地址:https://www.cnblogs.com/xyang/p/2948140.html
Copyright © 2020-2023  润新知