WCF(学习笔记)【参见WCF教程】
WCF:基于SOA(面向服务编程 )的一个.net框架产品 一种分布式通讯的统一模型(分布式通讯就是对多种 操作系统和平台的的兼容) 通信范围比较广
Web service .net Remoting
其他 WCF 其他
定义一个wcf服务后 它会对外发布一个
端点 协议 绑定
宿主程序:asp.net exe wpf window forms......
WCF可以支持的协议:TCP HTTP 跨进程 自定义协议
在WCF框架下 开发基于SOA的分布式系统
.net Remoting :能够高性能的实现.net 和.NET之间的通讯 受语言限制, Web Service:基于SOAP(协议), 可以跨平台调用:
WCF 是面向服务的产品 ,
那么WCF也是基于SOAP的通讯机制 ,这保证了系统之间的互操作性
WCF最重要的是能够快捷的额创建一个服务, WCF 包括三部分:
1,Service Class :一个标记了[ServiceContract]Attribute的类[契约标签]
[ServiceContract] [OperationConstract] 服务契约
[DataContract] [DataMember] 数据契约
2,Host(宿主):可以使应用程序 它是WCF Service运行的环境
也就是说 服务器上(的程序)
3,Endpoints:可以使一个 也可以是一组 wcf实现通讯的核心要素
WCF 由一组Endpoints集合组成 每个endpoint就是用于通信的入口
客 服 通过endpoint交换信息
一个endpoint(端点) 由三部分组成 : (where)address(地址):是endpoint的网络地址 它标记了消息发送的目的地
(what) contract (契约):描述消息包含的内容 以及消息的组织和操作方式
(how) Binding (绑定):描述如何发送消息 ,例如消息发送的传输协议(如TCP,HTTP) 安全(如ssl,soap消息安全)
opration操作
那么WCF是怎样通讯的呢????
WCF管理的是服务端和客户端的通信
对于服务端 WCF提供了类ServiceDescription用于描述一个WCF Service
对于客户端 WCF管理的是发送消息 时 需要使用到得通道Channel, 类channelDescription描述了这样一个通道
ServiceDescription Service Type ISerciceBehavor ServiceEndpoint EndpointAddress Binding ContractDescription
下面要写一个wcf的程序 首先要添加引用 system.ServiceModel
一般我们要定义wcf服务时 先把一个接口定义为一个服务 这样为了更好的面向对象(服务)编程 在接口中添加[ServiceContract] [OperationContract] [DataContract] [DataMember]
在实现接口类中就不需要 在添加标签啦
接下来:一个WCF Service 必须有host作为它的运行环境 ,这个host可以是
ASP.NET Windows Service 不通的应用程序 例如控制台程序
host实现
using System.ServiceModel
//创建一个SerciceHost对象 参数(服务实现类的类型typeof,url对象)
ServiceHost host =new ServiceHost(typeof(MyMethod),new Url("http://localhost:8080/HelloService"));
新建两个项目 一:wcf服务应用程序 服务端 二:控制台 客户端
服务端:接口 服务契约:标签
1,ServiceContract 声明接口或类在客户端可见 2,OperationContract 声明具体的方法在客户端可见
数据契约:标签
1,DataContract 把某个类或结构声明为数据契约 ,这个类就可以再客户端可见并可用来声明变量
2, DataMember 把服务端类中的变量 字段 标记为在客户端可见
客户端:
在客户端 控制台程序中 添加服务引用
在 发现 中会去寻找可用的服务
在最下面会有服务引用的命名空间 ServiceReference1
在客户端调用服务 1,定义通信管道 client 就是通过它来调用服务端提供的方法的
ServiceReference1.ServiclClient client =new ServiceReference1.ServiclClient ();
client.studentlClass();
2,服务端提供给客户端使用的类
ServiceReference1.student1(服务端的类) stu==
问题:
1,要想在客户端使用服务端里自定义的类型,除了用 [DataContract]声明之外 还要有一个服务契约(方法)[OperationContract]的返回值是这个类型的。 2,在接口类中(对客户端开发并可以调用的类型),在接口该类中,定义一个字段并赋默认值
定义一个属性并给它赋默认值
那么在客户端调用时 输出该类中的属性值
为空 默认值丢失???????
序列化的问题??????