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

article/2025/10/5 15:54:33
在VS2010里建立一个最简单的WCF服务,基本流程如下:
一:新建WCF应用
首先,新建一个WCF服务的应用(这里以framework 4.0为例),如下图所示,

建立完成之后,VS将自动生成一个最简单的WCF工程,在这个应用中,包含了最基本 “契约(Contract)”以及 “服务功能实现(Service)”.
工程如下:


不需要编辑任何文件,直接编译生成,得到一个WcfService1.dll文件
二、WCF应用中的契约(Contract)
在生成的WCF工程中,IService1.cs中为 “契约(Contract)”(本例中契约和服务放在同一个工程下了,实际上也可以分为两个工程),代码如下:
[ServiceContract]
public interface IService1
{[OperationContract]string GetData(int value);[Operation Contract]CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class CompositeType
{bool boolValue = true;string stringValue = "Hello ";[DataMember]public bool BoolValue{get {return boolValue; }set {boolValue = value; }}[DataMember]public string StringValue{get {return stringValue; }set {string Value = value; }}
}


可以看到,声明了服务契约IService1,以接口形式声明,其中还包括两个操作契约GetData以及GetDataUsingDataContract。还声明了数据契约CompositeType,以类的形式声明,包含两个数据成员BoolValue和StringValue。
三、WCF应用中的服务功能实现(ServiceBehavior)
在生成的WCF应用中,Service1.svc.cs中为 “服务功能实现(ServiceBehavior)” (本例中契约和服务放在同一个工程下了,实际上也可以分为两个工程),代码如下(Service1.svc还有其它作用,后面再说):
public class Service1 : IService1
{public string GetData(int value){return string.Format("You entered: {0}",value);}public CompositeType GetDataUsingDataContract(CompositeType composite){if (composite== null){throw new ArgumentNullException("composite");}if (composite.BoolValue){composite.StringValue+= "Suffix";}return composite;}
}


可以看到,这个Service1类实现了在契约中声明的IService1接口(服务契约),也使用到了CompositeType类(数据契约);实现了GetData以及GetDataUsingDataContract这两个服务契约中功能,这些功能即为WCF服务允许外部程序进行调用的功能。
四、寄宿(Host)WCF服务
有2种常见的寄宿方式:
1)一种是为一组WCF服务创建一个托管的应用程序,通过手工启动程序的方式对服务进行寄宿,所有的托管的应用程序均可作为WCF服务的宿主,比如 Console应用、Windows Forms应用和ASP.NET应用等,我们把这种方式的服务寄宿方式称为自我寄宿(Self Hosting)。
2)另一种则是通过操作系统现有的进程激活方式为WCF服务提过宿主,Windows下的进程激活手段包括IIS、Windows Service或者WAS(Windows Process Activation Service)等
无论采用哪种寄宿方式,在为某个服务创建 ServiceHost的过程中,WCF框架内部会执行一系列的操作,其中最重要的步骤就是为服务创建服务描述(Service Description)
本例以第一种为例,建立一个WinForm应用作为托管程序,在VS2010中,建立一个普通的WinForm程序(以frameword4.0为例),如下图:
在工程中,添加对System.ServiceModel的引用,并添加对刚才生成的WcfService1.dll的引用,然后在Form上添加一个Button和一个Label控件,如下图:

在WinForm工程中添加对要托管的WCF服务的描述,既可以通过代码实现,也可以通过工具生成。本例在VS2010下,通过Tools-WCF Service Configeration Editor工具生成。
点开后,通过菜单的File-New Config新建一个描述文件,然后点击Service页面的Create a New Service,弹出如下界面:

点击Browse...按钮,选中刚才生成的WcfService1.dll,并选中其中的Service1服务,点击下一步,弹出如下界面:

这个界面中要选择使用的契约,默认即可,点击下一步,弹出如下界面:

这个界面中要选择使用的网络通讯协议,选择最通用的HTTP协议,并在下一个界面中选择基本的Http服务(Basic WebService interoperablitity),
在接下来的界面中,输入访问地址,其它程序可以通过这个地址来访问本WCF服务。

完成这一步之后,接下来还有一些设置,我也不清楚用途,略去,最后点击File-Save,生成一个App.config文件。这里把该文件贴上来:
<?xml version="1.0" encoding="utf-8"?>
<configuration><system.serviceModel><behaviors><serviceBehaviors><behavior name="NewBehavior0"><serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8585/wcf1/metadata" /></behavior></serviceBehaviors></behaviors><services><service behaviorConfiguration="NewBehavior0" name="WcfService1.Service1"><endpoint address="" binding="basicHttpBinding"bindingConfiguration="" name="ep1" contract="WcfService1.IService1" /><host><baseAddresses><add baseAddress="http://localhost:8585/wcf1" /></baseAddresses></host></service></services></system.serviceModel>
</configuration>


把该App.config文件放在与WinForm工程的根目录下(与Form1.cs同一目录),还需要在VS中将该文件加入到工程中。
添加Button控件的处理函数:
private void button1_Click(objectsender, EventArgs e)
{System.ServiceModel.ServiceHosthost =new System.ServiceModel.ServiceHost(typeof(WcfService1.Service1));host.Open();this.label1.Text= "opened";
}

编译运行,点击界面中的Button控件,即可以将该WCF服务寄宿到该Frm中(关闭窗体后WCF服务结束)。
注:如果运行时报这个错误(HTTP could not register URL http://+:8585/wcf1/. Your process does not have access rights to this namespace),有可能是权限不足导致,需要使用管理员权限运行。
五、在客户端访问并调用WCF服务
新建一个WinFrm工程(不要关闭刚才的寄宿界面),在VS菜单中点击Project-Add Service Reference..项,输入刚才在寄宿界面中定义的地址,就可以添加对该WCF服务的引用,如下图:

在程序中使用如下代码,即可以调用WCF服务中的GetData方法:
ServiceReference1.Service1Clientaa=newServiceReference1.Service1Client();
MessageBox.Show(aa.GetData(2));


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

相关文章

什么是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版本需要统…

Windows内核--子系统(3.5)

到底什么是子系统? 子系统是用户层概念。在Windows内核之上&#xff0c;如果想要执行类UNIX应用程序&#xff0c;就是POSIX子系统&#xff0c;如果要类似OS/2环境&#xff0c;就是OS/2子系统。 如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。 对于W…

无法正常进入Windows也能开启Windows内核调试

1 背景 Windows的启动的早期阶段&#xff0c;大致分为3步&#xff1a;bootmgr&#xff0c;winload&#xff0c;nt内核加载。 下图是Winload阶段的一个报错。 如果出现Windowslogo&#xff0c;一般就是进入nt内核加载了。 我们经常开的调试功能是nt内核加载后的调试。无法调试…

windows内核开发学习笔记二十四:windows内核架构

从上图上可以看出&#xff0c;windows内核主要层次划分为三个层次&#xff0c;以及windows子系统、文件系统、网络、设备驱动程序等几个部分。 硬件抽象层&#xff08;Hardware Abstraction Layer&#xff0c;简称HAL&#xff09;&#xff1a;主要是把所有与硬件相关联的代码隔…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间&#xff0c;这样会增大内核风险。相反&#xff0c;内核抽象出Handle给用户态&#xff0c;不管是文件、进程、线程等对象&#xff0c;通过Handle可以隐藏内核细节&#xff0c;统…

Windows内核基础之权限级别

权限级别是CPU中的一个概念&#xff0c;CPU中包含4个权限级别&#xff0c;分别是0环&#xff0c;1环&#xff0c;2环&#xff0c;3环&#xff0c;CPU设计制造商最初希望0环用于运行内核&#xff0c;1环和2环运行设备驱动&#xff0c;3环运行应用程序&#xff0c;但是系统设计者…

Windows内核--调试内核源代码(1.5)

Kernel编译和普通应用程序编译有差异吗&#xff1f; 最终Kernel二进制档是给CPU执行的&#xff0c;只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可&#xff0c;从编译角度&#xff0c;内核和应用程序无差别。Windows内核是exe文件。 内核与用户应用程序运行环境有…

Windows内核驱动Hook入门

文章目录 Hook框架选择基于微软规范的框架微软规范以外的框架简单介绍一下InfinityHook 获取内核中的函数地址内核中导出的函数内核未导出的函数获取 SSDT ShadowSSDT 地址获取系统服务号手动获取获取并判断系统版本 代码自动获取 获取GUI相关的函数地址&#xff0c;还需附加GU…