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会自动生成一系列用于服务调用的代码和配置。

代码:

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文件,所以导致实验不能继续。待研究明白后继续补充。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏和蔼的张星的图像处理专栏

1.Win10+VsCode的C/CPP编译环境搭建

我是从开始学C++的时候就一直用的是visual studio,毕竟宇宙第一IDE,写和调试都是超级方便快捷,唯一的缺点可能就是启动慢一点。 之前电脑没有换固...

85560
来自专栏代码世界

Python之进程

进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机...

68170
来自专栏大内老A

WCF客户端运行时架构体系详解[下篇]

当基于某个终结点创建的ChannelFactory<TChannel>被开启的之后,位于服务模型层的客户端运行时框架被成功构建。站在编程的角度看ChannelF...

18660
来自专栏测试开发架构之路

JMeter测试工具.jmx文件详解

摘要:了解.jmx文件格式类型,对jmeter二次开发与拓展有很大的帮助,当然也可以利用python对其进行一些处理(生成一些测试用例,对jmx文件进行 ”增删...

31440
来自专栏编程软文

redis的使用和安装,redis基础和高级部分

40670
来自专栏大内老A

WCF的安全审核——记录谁在敲打你的门

WCF所谓的安全审核就是针对认证和授权所做的针对EventLog的日志记录。我们不但可以设置进行审核的事件(认证成功/失败,授权成功或失败),还可以选择记录信息...

27080
来自专栏Java帮帮-微信公众号-技术文章全总结

Python常见面试题【悟空教程】

1.MySQL 数据库总结 MySQL 可以建多少个数据库,理论上是没有限制的,每一个数据库可以有上亿的对象,但是一般基于硬件要求、效率问题一般不超过64个, ...

19920
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第三十三天 MongoDB初级学习

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

26120
来自专栏Golang语言社区

goroutine背后的系统知识

Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干流...

35340
来自专栏Java架构

前沪江高级架构师学习笔记分享:分布式框架设计与实现

20760

扫码关注云+社区

领取腾讯云代金券