编程三大核心内容之二:通信

WCF是.NET提供的具备高度灵活性的通信管理框架。

image

wcf使用OData(开放式数据协议)创建数据服务,将数据通过URI公开,允许使用REST(具象状态传输)来访问及更改数据,即标准HTTP动词GET、PUT、POST和DELETE操作。OData定义了Atom、JSON、XML格式等发布协议。

image

〇、概述

1.定义数据模型

1.1 ADO.NET 实体框架

1.2 基于CLR对象的数据模型,该模型返回IQueryable<T>接口,须实现IUpdatable来实现创建、更新、删除操作。

1.3 自定义数据提供程序

1.3.1 元数据提供程序 IDataServiceMetadataProvider

1.3.2 查询提供程序 IDataServiceQueryProvider

1.3.3 更新提供程序 IDataServiceUpdateProvider

1.3.4 分页提供程序 IDataServicePagingProvider

1.3.5 流提供程序 IDataServiceStreamProvider

2.创建数据服务

从DataService<T>类继承,T为实体容器

3.配置数据服务

DataServiceConfiguration 配置对资源和服务操作的访问。

4.访问数据服务资源

4.1通过URI访问

例:协议+命名空间+实体+键+属性|关联+/$value|?$filter=XXX

4.2 HTTP操作:HTTP GET 、HTTP POST、HTTP DELETE、HTTP PUT、HTTP MERGE

4.3 http put, post, merge请求发送实体数据的格式:Atom、JSON

4.4 客户端库类DataServiceContext和DataServiceQuery<T>将Atom、JSON等消息转换为代表实体数据的CLR对象。

5.客户端库类

DataServiceContext 封装针对指定数据服务支持的操作(可保持上下文):

.Credentials 可指定发送凭据

.SendingReuest 发送请求前事件

.AddRelatedObject  添加实体,并在两个相关实体对象之间创建新的链接

.AddLink 创建链接

.SetLink 更新链接(0..1:1、1:1)

.DeleteLink 删除链接

.AttachLink 附加链接

.DetachLink 终止链接(*:*)

.AddObjcet 在上下问中添加项

.AttachTo 添加一个已在数据库中的对象而无需查询

.UpdateObject 标记已更新对象

.DeleteObject 标记已删除对象

.SaveChanges 提交更改

DataServiceQuery<T>表示一个针对特定实体集的查询:

.AddQueryOption (String,Object)添加一个查询选项。

.Execute() 执行查询,返回IEnumerable<T>源,可前置转换为QueryOperationResponse<T>对象

.IncludeTotalCount 实体集中实体的总数

.Expand 预加载相关实体

.LoadProperty  显式加载相关实体

QueryOperationResponse 包含:

.Error 操作引发的错误

.Headers 与查询响应关联的HTTP响应表头的集合

.Query 生成结果对应的DataServiceQuery<T>

.StatusCode  查询响应的HTTP响应代码

.TotalCount 实体集总数

.GetContinuation 返回一个DataServiceQueryContinuation<T>对象,包含下一页结果的URI

一.特点

1.灵活的服务端支持: asp.net、windows服务、com+进程、windows窗体等。

2.编程方便:不需要共同基类。

3.信道可选:http、tcp、ipc、自定义信道。

4.安全:支持wse 3.0标准。

5.扩展性:soap注入。

6.集成性:支持dcom和asp.net web服务的集成。

二、核心服务

1.SOAP 简单对象访问协议

2.WSDL Web服务描述语言

3.REST 代表性状态传输

4.JSON JavaScript对象标记

三、自定义服务宿主

1.继承自System.ServiceModel.ServiceHost

2. 实例.Open() 启动监听器信道

3.实例.Close() 关闭服务

4. 用WCF Service Configuration Editor 工具编辑 WCF配置文件

四、客户端

1.添加一个服务引用(服务使用了mexHttpBinding 绑定MEX端点)

2.添加System.Runtime.Serialization、System.ServiceModel 程序集引用,和绑定信息与端点的配置文件

3.生成代理类,和实体类,该实体类包含[DataMember]标注的元素

五、诊断

可使用Service Configuration Editor工具配置。用Service Trace Viewer(svctraceviewer.exe)工具查看跟踪文件。

六、协定

1.数据协定[DataMember] :  .Name字段名 .Order 序列化顺序 .IsRequired 可选性 .EmitDefaultValue 默认值是否序列化

2.数据版本[DataContract]: .Namespace xml命名空间 (删除字段和添加必要字段应修改命名空间来区分不同版本)

3.服务协定[ServiceContract]:标注服务接口 .ConfigurationName 服务配置名 .CallbackContract 双工通信客户端 .Name <portType>的名字 .Namespce <portType>的名称空间 .SessionMode 会话类型 .ProtectionLevel 保护通信类型

4.操作协定[OperationContract]: .Action 请求链接,默认是xml名称空间、协定名、操作名和响应类型(Response结尾)的组合 .ReplyAction 回应链接 .AsyncPattern 异步链接 .IsInitiating 初始会话 .IsTeminating 结束会话 .IsOneWay 无响应操作 .Name 操作名 .ProtectionLevel 安全类型

5.传输协定:[DeliveryRequirements]、[RequireOrderedDelivery]、[QueuedDeliveryRequirements]

6.消息协定:[MessageContract]、[MessageHeader]、[MessageBodyMember]

七、实现服务

1.[ServiceBehavior]标注实现类:

.TransactionAutoCompleteOnSessionClose 会话类型 .TransactionIsolationLevel 事务隔离级别 .ReleaseServiceInstanceOnTransactionComplete 会话完成时 .AutomaticSessionShutdown 会话关闭 .InstanceContexMode 对象状态 .ConcurrencyMode 并发 .UseSynchronizationContext 窗口线程 .IncludeExceptionDetailInFaults 异常处理 .MaxItemsInObjectGraph 序列化对象的数目 .ValidateMustUnderstand 理解标题

2.实现服务接口

3.[OperationBehavior] :

.AutoDisposeParameters 参数自动释放 .Impersonation 调用者身份运行 .ReleaseInstanceMode 生命周期 .TransactionScopeRequired 事务 .TransactionAutoComplete 自动完成事务

八、编程实现客户端

1.ChannelFactory类例子:

var binding = new WSHttpBinding();

var address = new EndpointAddress(链接);

var factory = new ChannelFactory<I服务>(binding, address);

I服务 channel = factory.CreateChannel();

factory.Close();

2.visual studio 添加服务引用

3.ServiceModel 元数据实用工具(Svcutil.exe) 产生代理类:

var client = new XXServiceClient();

client.RegisterForCourse(…);

client.Close();

4.双工通信

必须在客户端中实现指定协定接口。

服务器端:

public interface IMyMessageCallback{

[OperationContract(IsOneWay=true)]

void OnCallback(string message);}

[ServiceContract(CallbackContract=typeof(IMyMessageCallback))]

public interface IMyMessage{

[OperationContract]

void MessageToServer(string message);}

客户端:

class ClientCallback: IMyMessageCallback{

public void OnCallback(string message){}}

 

九、异常处理

1.[FaultContract] 标注操作关联的异常数据类

2.抛出FaultException<异常数据类>

十、绑定

绑定描述了服务的通信方式。包括:传输协议、安全性、编码格式、事务流、可靠性、形状变化、传输升级。

预定义绑定:

image

按功能分:

image

 

十一、消息队列

消息队列是通信任务的重要辅助工具。System.Messaging 空间封装了windows操作系统的消息队列读写功能。

image

原文地址:https://www.cnblogs.com/Nobel/p/4155456.html