网络编程之WCF编程:WCF服务和客户端的建立,回调

article/2025/10/5 14:17:27

1.概念

Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口。它是.NET框架的一部分,由 .NET Framework 3.0 开始引入。

WCF的终结点有三个要素组成,分别是地址(Address)、绑定(Binding)和契约(Contract),简记可写成Endpoint = ABC。
 地址:地址决定了服务的位置,解决了服务寻址的问题。
 绑定:绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能对消息进行的相应处理。绑定的类型包括BasicHttpBinding、WsHttpBinding、NetTcpBinding等。
 契约:契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。

 

2.契约

WCF 的基本概念是以契约(Contract) 来定义双方沟通的协议,契约必须要以接口的方式来体现,而实际的服务代码必须要由这些合约接口派生并实现。契约分成了四种:
数据契约 (Data Contract),订定双方沟通时的数据格式。服务契约 (Service Contract),订定服务的定义。操作契约 (Operation Contract),订定服务提供的方法。消息契约 (Message Contract),订定在通信期间改写消息内容的规范。

如下图,解释了契约:

 

3.绑定

由于 WCF 支持了 HTTP,TCP,Named Pipe,MSMQ,Peer-To-Peer TCP 等协议,而 HTTP 又分为基本 HTTP 支持 (BasicHttpBinding) 以及 WS-HTTP 支持 (WsHttpBinding),而 TCP 亦支持 NetTcpBinding,NetPeerTcpBinding 等通信方式,因此,双方必须要统一通信的协议,并且也要在编码以及格式上要有所一致。

 基本绑定(BasicHttpBinding)

对应BasicHttpBinding类,能够将WCF服务公开为传统的ASMX Web服务,是以前就的程序能够使用现在的WCF服务。在实际开发中一个WCF服务可能会给不同的程序调用,如给Java的程序调用,给Flex的程序调用等,那么采用BasicHttpBinding最合适不过了

TCP绑定(NetTcpBinding)

对应与NetTcpBinding类,TCP绑定使用TCP协议在Intranet中跨机器的通信,注意这里是Intranet而非Internet。支持多种特性,包括可靠性、事务性、安全性、以及WCF之间通信的优化。前提是要求客户端与服务端都必须使用WCF

 

4.程序设计

第一步:wcf服务端

新建一个“windows窗体程序”名称为WCFHostServer,然后添加一个“WCF服务”名称为Service1

给窗体取名为FormService,然后在窗体的Load事件中编写代码启动wcf服务:NetTcpBinding方式启动wcf服务和BasicHttpBinding方式启动wcf服务

ServiceHost m_ServiceHost;


private void Form1_Load(object sender, EventArgs e)
{//NetTcpBinding方式启动wcf服务m_ServiceHost = new ServiceHost(typeof(Service1));//Service1是wcf服务的类名称NetTcpBinding binding = new NetTcpBinding();Uri baseAddress = new Uri(string.Format("net.tcp://localhost:10086/WCFHostServer/Service1"));m_ServiceHost.AddServiceEndpoint(typeof(IService1), binding, baseAddress);//BasicHttpBinding方式启动wcf服务ServiceMetadataBehavior metadataBehavior;metadataBehavior = m_ServiceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();if (metadataBehavior == null){metadataBehavior = new ServiceMetadataBehavior();metadataBehavior.HttpGetEnabled = true;metadataBehavior.HttpGetUrl = new Uri(string.Format("http://localhost:10085/WCFHostServer/Service1"));m_ServiceHost.Description.Behaviors.Add(metadataBehavior);}m_ServiceHost.Open();
}

在窗体的Closeing中编写服务退出代码

private void FormService_FormClosing(object sender, FormClosingEventArgs e)
{if (m_ServiceHost != null){m_ServiceHost.Close();m_ServiceHost = null;}
}

在 IService1.cs中增加一个方法GetSvrTime

 在Service1.cs中实现接口的方法GetSvrTime,获取服务器时间

 

 

第二步:WCF客户端

新建一个“windows窗体程序”命名为WCFHostClient,在Debug中运行WCFHostServer窗体(这一步很重要),然后在项目WCFHostClient中右键--》“添加服务引用”,在地址填入以BasicHttpBinding绑定方式启动wcf服务的地址http://localhost:10085/WCFHostServer/Service1,点击“前往”,然后连接上后点击“确定”,在WCFHostClient项目中就会增加一个Service References(ServiceReference1)

 将窗体命名为FormClient.cs,在窗体上增加两个textbox(ip为textbox1,port为textbox2)和一个button,如下图:

在button中增加wcf客户端连接wcf服务端的代码

private void button1_Click_1(object sender, EventArgs e)
{//basicHttpBinding绑定方式的通讯 单工Service1Client host = new ServiceReference1.Service1Client();string htime = host.GetSvrTime();//调用GetSvrTime获取到wcf服务器上的时间MessageBox.Show("basicHttpBinding" + "@" + htime);//NetTcpBinding绑定方式的通讯 双工IService1 m_Innerclient;ChannelFactory<IService1> m_ChannelFactory;NetTcpBinding binding = new NetTcpBinding();Uri baseAddress = new Uri(string.Format("net.tcp://{0}:{1}/WCFHostServer/Service1",textBox1.Text, textBox2.Text));m_ChannelFactory=new ChannelFactory<IService1>( binding, new EndpointAddress(baseAddress));m_Innerclient = m_ChannelFactory.CreateChannel();string htime1=m_Innerclient.GetSvrTime();//调用GetSvrTime获取到wcf服务器上的时间MessageBox.Show("NetTcpBinding" + "@" + htime1);
}

上面的代码是客户端调用服务端提供的接口GetSvrTime来通讯的,那么服务端如果发生了一个事件想主动通知客户端,又不可能反向调用客户端提供的接口,这时候就需要使用回调的方式进行wcf通讯了,也就是说服务端定义一个回调,客户端注册这个回调,然后就可以在这个回调里等待服务端的信息通知了

 

第三步:服务端回调通知客户端信息

wcf服务端WCFHostServer步骤

1.在IService1.cs中增加一个回调接口ISvrToCliCallBack,增加方法NotifyClientMsg,设置该方法为单向,如图:


 

 2.Service1.cs中在客户端调用方法GetSvrTime的时候获取ISvrToCliCallBack的实例


 注意: 使用OperationContext.Current来获取当前客户端操作的实例只有在客户端调用服务端提供的接口的时候才能有效,否则为NULL

 所以OperationContext.Current.GetCallbackChannel必须在GetSvrTime里实现

3.在FormServer窗体上增加一个按钮,点击该按钮实现通知客户端的功能


 在button增加下面代码

 private void button1_Click(object sender, EventArgs e){Service1.userCallBack.NotifyClientMsg("服务端给客户端通知啦");}
调用NotifyClientMsg通知客户端


wcf客户端WCFHostClient步骤:

1.在Debug目录中开启WCFHostServer.exe,客户端在ServiceReference1更新服务引用

2.在FormClient中继承接口IService1Callback,实现方法NotifyClientMsg


也就是说,当服务端有信息通知的时候(点击FromServer上面的“通知客户端”按钮)客户端的这个方法就会激活


3.在FormClient_Load中使用双工绑定方式NetTcpBinding来连接wcf服务(注:不能使用单工方式basicHttpBinding)

IService1 m_Innerclient;

 

注意:这里要使用双工通道DuplexChannelFactory,而不是ChannelFactory

 

4.向wcf服务注册客户端操作的实例

 m_Innerclient.GetSvrTime();
这句可以放在Form_load最后,也就是连接完wcf服务之后进行


以上wcf服务端和客户端都完成了,客户端和服务端程序运行后,点击服务端窗体的“通知客户端”,客户端就会弹出窗体

 

 

 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/i3LnYTtW.shtml

相关文章

WCF 学习总结2 -- 配置WCF

前面一篇文章《WCF 学习总结1 -- 简单实例》一股脑儿展示了几种WCF部署方式&#xff0c;其中配置文件(App.config/Web.config)都是IDE自动生成&#xff0c;省去了我们不少功夫。现在回过头来看看IDE提供的Wcf Service Library项目模板中的默认服务端配置文件——App.config里面…

[老老实实学WCF] 第一篇 Hello WCF

老老实实学WCF 第一篇 Hello WCF WCF(Windows Communication Foundation)是微软公司推出的面向服务技术的集大成者&#xff0c;涵盖继承了其之前发布的所有的分布式应用程序的编程模型&#xff0c;涉及面之广&#xff0c;技术之复杂&#xff0c;结构之零散&#xff0c;让我们…

WCF入门教程(一)

WCF入门教程&#xff08;一&#xff09; 一、 概述二、基于Asp.net 的应用程序开发与面向服务开发三、第一个WCF程序IUser代码:User代码 四、场景五、将WCF程序寄宿在B服务器的IIS之上六、在客户端[A服务器]创建服务的引用七、使用WCF的方法九、代码下载 一、 概述 Windows Co…

WCF简介

WCF是Windows Communication Foundation的缩写&#xff0c;是MS为SOA&#xff08;Service Oriented Architecture 面向服务架构&#xff09;而设计的一套完整的技术框架。WCF是Microsoft为构建面向服务的应用提供的分布式通信编程框架,使用该框架&#xff0c;开发人员可以构建跨…

无废话WCF入门教程一[什么是WCF]

一、概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口&#xff0c;可以翻译为Windows通讯接口&#xff0c;它是.NET框架的一部分。由 .NET Framework 3.0 开始引入。 WCF的最终目标是通过进程或不同的系统、通过本地网络或是通过Inter…

C# WCF入门

目录标题 一、什么是WCF二、第一个WCF程序三、WCF服务的使用 一、什么是WCF WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案&#xff0c;且能与已有系统兼容协作。WCF是微软分…

wcf学习--建立最简单的WCF服务

在VS2010里建立一个最简单的WCF服务&#xff0c;基本流程如下&#xff1a; 一&#xff1a;新建WCF应用 首先&#xff0c;新建一个WCF服务的应用&#xff08;这里以framework 4.0为例&#xff09;&#xff0c;如下图所示&#xff0c; 建立完成之后&#xff0c;VS将自动生成一个最…

什么是WCF

文章目录 一、概述二、基于Asp.net 的应用程序开发与面向服务开发三、第一个WCF程序四、场景五、将WCF程序寄宿在B服务器的IIS之上六、在客户端[A服务器]创建服务的引用七、使用WCF服务端的方法 一、概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应…

面向服务的WCF编程(一)

第七章&#xff1a;WCF入门 课后习题&#xff1a; 1.简要介绍WCF服务的承载方式及其特点。 WCF服务的承载方式包括&#xff1a;利用IIS或者WAS承载、利用Windows服务承载、自承载。其特点如下&#xff1a; &#xff08;1&#xff09;用IIS或者WAS承载&#xff1a;这是最常用…

WCF 详解

一、什么是WCF&#xff1f; ​ .NET Framework 3.0 中开始引入一种专门用来构建分布式系统的API——WCF&#xff0c;与过去所有的其他分布式API&#xff08;如DCOM,.NET Remoting,XML WebService,消息队列&#xff09;有所不同&#xff0c;WCF提供统一的&#xff0c;可扩展的编…

Windows内核原理与实现之 GDI (图形设备接口)

文章摘录自《Windows内核原理与实现》一书。 图形用户界面是 Windows 操作系统的重要特色&#xff0c;这也是在 Windows 子系统中提供的。概括而言&#xff0c;Windows 的图形系统有两方面特点&#xff1a;首先&#xff0c;它提供了一套与设备无关的编程接口&#xff0c;即 G…

windows 驱动与内核调试 学习

概述 本文讲述笔者在学习内核和驱动开发的笔记。 驱动概述 一般驱动需要运行内核权限下运行(因为涉及硬件读取)&#xff0c;比如Intel下的ring 0 权限下。在windwos大量病毒和杀软为了特殊目的往往都是通过将自身升级为内核驱动方式进行运作。如果病毒程序首先进入ring 0理论…

Windows内核--CPU和内核(1.7)

Windows内核支援哪些CPU? Intel x86/x86_64 IA64已不再支持. AMD amd64 ARM (Windows On Arm: WOA) ARM具备低功耗优势, 除了高通, 还有Broadcom/NXP等都支援ARM架构. 苹果自研M系列开了头&#xff0c;ARM不仅有低功耗&#xff0c;同样有性能&#xff0c;Windows也想分一杯羹…

windows内核驱动

内核&驱动基础 WDK(Windows Driver Kit) 内核编程需要使用WDK WDK 下载 windows xp wdk 下载地址 WDK 安装 勾选所有的安装项,避免错过一些例子 默认安装目录: C:\WinDDKfirst驱动开发 源码 first.c #include <ntddk.h>#define DEBUG/** 卸载函数*/ VOID Driver…

Windows 内核会换为 Linux 吗?

关注、星标公众号&#xff0c;不错过精彩内容 来源&#xff1a;网络 编辑整理&#xff1a;strongerHuang 如果装个纯linux&#xff0c;则一些windows软件没法用。如果用windows然后装个虚拟机&#xff0c;在虚拟机上安装linux&#xff0c;又感觉麻烦而且占用电脑资源。 现在win…

Windows内核之系统架构

一.架构概述 下图显示了Windows的基本结构。Windows采用双模式来保护操作系统本身&#xff0c;以避免被应用程序的错误所波及。操作系统核心运行在内核模式下&#xff0c;应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块&#xff08;内核驱动程…

Windows内核原理与实现之Windows设备驱动程序

文章摘录自《Windows内核原理与实现》一书。 设备驱动程序是操纵设备的内核模块&#xff0c;I/O 管理器、即插即用管理器和电源管理器都需要与设备的驱动程序打交道。 在Windows I/O 系统中&#xff0c;设备驱动程序不仅为操作系统提供了支持各种 I/O 设备的能力&#xff0c;…

Windows内核的基本概念

Windows内核的基本概念 1 处理器模式 Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode)&#xff1b;3 表示用户模式(user mode)。 1.1 内存管理 Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间看待。其中2~4GB是所有进程共享的&#xff0c;为系…

Windows内核--源代码在哪里?(1.1)

大部分人能看到这篇帖子, 想必已经用过Windows系统多年了... 微软官方并不完全公开源代码 想清楚Windows技术内幕&#xff0c;就需要逆向工具。幸运的是: WRK源代码(Windows Research Kernel) (XP/Server 2003)Windows 2000源代码(Kernel和用户层) 深入解析Windows操作系统(最…

windows内核驱动开发(WDK环境搭建)

去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了。 下面直接下载步骤二和步骤三的SDK和WDK。 SDK下载地址 WDK下载地址 注意下载的SDK和WDK版本需要统…