可以创建一个Windows 服务

时间:2022-05-15 08:02:54

WCF全称为Windows Communication Foundation,在.Net 3.0 中引入,用于客户端与处事端通信,替换了之前的一些技术,如.Net Remoting 及 WSE。

WCF 对比ASP.NET Web API 庞大,但供给了更多的成果,如

(1)、可靠性

(2)、事务

(3)、Web处事安适

如果不需要这些先进的通信成果,ASP.NET Web API是更好的选择。

2、WCF 主要成果

(1)、存储组件和处事,可以将WCF处事存放在ASP.NET 运行库、Windows处事、COM+进程或WPF应用措施中,进行对等计算

(2)、声明行为,不需要担任基类,可以使用属性界说处事。

(3)、通信信道,WCF供给了用HTTP、TCP、IPC信道进行通信的多条信道,撑持自界说信道。

(4)、安适布局,为实现独立于平台的WEB处事,必需使用标准化的安适环境,标准用WSE3.0实现。

(5)、可扩展性,撑持将成果注入客户端和处事真个动静流。

(6)总结

!最终方针:通过进程或差别系统,通过本地网络或Internet收发客户端和处事之间的动静,如果需要以独立于平台的方法尽快收动员静,就应该使用WCF。

!远距离视图

处事供给了一个端点,由协定、绑定、地点描述。

a:协定,界说了处事供给的操纵

b:绑定,给出了协议和编码信息

c:地点,是处事的位置,客户端需要一个兼容的端点来进行访谒。

3、WCF 组件及法式解读

 

可以创建一个Windows 服务

法式解读:

(1)、客户端,客户端挪用代办代理的一个要领

(2)、代办代理,代办代理将要领挪用转化为一条动静,并把该动静传输到信道上。

(3)、信道,包罗客户端部分及处事端部分,他们通过网络协议进行通信,在信道上,把动静通报给调理措施。

(4)、调理措施,将动静转换为处事挪用的要领挪用。

4、WCF 其他重要技术

(1)、SOAP协议

处事从客户端接收SOAP动静,并返回一条SOAP响应动静,SOAP动静包罗信封,信封包罗标题和正文。

(2)、WSDL

WSDL文档描述了处事的操纵和动静,WSDL界说了处事的元数据,这些元数据用于为客户端应用措施创建代办代理。

WSDL包罗如下信息:

a:动静的类型——用XML架构描述

b:从处事中收发的信息——动静的各部分用XML架构界说的类型

c:端口类型——映射处事协定,列出用处事协定界说的操纵,操纵包罗信息,如与请求和响应序列一起使用的输入和输出动静

d:绑定信息——包罗用端口类型列出的操纵,并界说使用的SOAP变体

e:处事信息——把端口类型映射到端点地点

5、WCF实战——预定会议室

5.1 前言

业务场景,存储会议室预订信息,应用mysql数据库中的roomreservations表存储预订信息,主要实施法式包孕

(1)创建处事和数据协定

(2)使用 自界说类库 访谒数据库

(3)实现处事

(4)使用WCF处事宿主(Service Host)和WCF测试客户端(Test Client)

(5)创建定制的处事宿主

(6)使用元数据创建客户应用措施

(7)使用共享的协定创建客户应用措施

(8)配置诊断设置

5.2 具体实现

(1)创建数据协定和处事协定

  整体布局:

可以创建一个Windows 服务

1.1 创建数据协定

创建RoomReservationContracts类库,新建RoomReservation类,该类主要包罗数据协定,具体属性字段与数据库中表对应。

using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.CompilerServices; using System.Runtime.Serialization; namespace RoomReservationContracts { /// <summary> /// 数据协定 /// </summary> [DataContract] public class RoomReservation : INotifyPropertyChanged { private int _id; private string _roomName; private DateTime _startTime; private DateTime _endTime; private string _contact; private string _text; /// <summary> ///要通过WCF处事发送数据, 引入DataContract 和 DataMember 特性对该类进行注解 /// </summary> [DataMember] public int Id { get { return _id; } set { SetProperty(ref _id, value); } } [DataMember] [StringLength(45)] public string RoomName { get { return _roomName; } set { SetProperty(ref _roomName, value); } } [DataMember] public DateTime StartTime { get { return _startTime; } set { SetProperty(ref _startTime, value); } } [DataMember] public DateTime EndTime { get { return _endTime; } set { SetProperty(ref _endTime, value); } } [DataMember] [StringLength(45)] public string Contact { get { return _contact; } set { SetProperty(ref _contact, value); } } [DataMember] [StringLength(45)] public string Text { get { return _text; } set { SetProperty(ref _text, value); } } /// <summary> /// 接口需实现的事件要领 /// </summary> public event PropertyChangedEventHandler PropertyChanged; /// <summary> /// 得知属性产生变换时(界说为protected virtual 允许子类覆写本要领) /// </summary> /// <param>属性字段</param> protected virtual void OnNotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } /// <summary> /// 设置属性 /// </summary> /// <typeparam>传入的类型参数</typeparam> /// <param>字段名</param> /// <param>字段值</param> /// <param></param> protected virtual void SetProperty<T>(ref T item,T value,[CallerMemberName] string propertyName = null) { //如果两个类型的东西T 是否不等 if (!EqualityComparer<T>.Default.Equals(item, value)) { item = value; OnNotifyPropertyChanged(propertyName); } } } }

1.2 创建处事协定

处事供给的操纵可由接口界说,处事协定用ServiceContract特性界说,操纵由OperationContract特性界说