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文件,所以导致实验不能继续。待研究明白后继续补充。
- hdu 4033Regular Polygon(二分+余弦定理)
- Debian8配置SSH允许root登陆
- hdu 4405Aeroplane chess(概率DP)
- hdu 3853LOOPS (概率DP)
- cf(#div1 B. Dreamoon and Sets)(数论)
- hdu 1805Expressions(二叉树构造的后缀表达式)
- 清空messages没有权限的解决方法
- hdu1710(Binary Tree Traversals)(二叉树遍历)
- 基本线程同步(一) 同步方法
- uva514(trail)(模拟栈)
- zoj3822 Domination(概率dp)
- Veeam Backup & Replication(三):创建备份与还原备份
- 使用Go开发一个简单的服务器程序
- C++ 与设计模式学习(其一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP7 安装event扩展的实现方法
- 在laravel框架中使用model层的方法
- 漂亮的thinkphp 跳转页封装示例
- thinkphp5框架前后端分离项目实现分页功能的方法分析
- laravel 根据不同组织加载不同视图的实现
- 详解将数据从Laravel传送到vue的四种方式
- Laravel实现ApiToken认证请求
- laravel 实现划分admin和home 模块分组
- laravel在中间件内生成参数并且传递到控制器中的2种姿势
- 在laravel框架中实现封装公共方法全局调用
- laravel通过a标签从视图向控制器实现传值
- 在Laravel 的 Blade 模版中实现定义变量
- 解决Laravel5.5下的toArray问题
- Laravel基础_关于view共享数据的示例讲解
- 解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题