C# 编写WCF简单的服务端与客户端
http://www.wxzzz.com/1860.html
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。
今天带如何一步一步实现WCF服务端与客户端的开发及基础讲解。
一、在Visual Studio中创建WCF项目
首先打开Visual Studio(我这里使用的是VS2013),然后创建一个空的解决方案命名为WCFDemo。
然后创建下面列出的4个项目并进行关系引用。
- Contracts:它是一个类库项目,用于定义契约,在项目的引用中添加
System.ServiceMode
程序集; - Services:它是一个类库项目,用于实现契约,所以需要引用我们的
Contracts
项目; - Hosting:一个控制台应用,实现启动WCF服务,该项目须要同时引用我们的
Contracts
项目和Services
项目,并且引用System.ServiceMode
程序集; - Client:一个控制台应用,也需要引用
System.ServiceMode
程序集;
创建好后,如图所示:
二、创建服务契约
首先我们需要在Contracts项目中创建契约(也就是interface
接口),这里我的契约指定需要实现2个功能,分别是GetServerTime
获取服务器当前时间,GetServerName
获取服务器名称。
编写代码的时候需要注意,需要给interface加上ServiceContract
标记属性(指示接口或类在WCF应用程序中定义服务协定),每个契约的方法需要加上OperationContract
标记属性(指示方法定义一个操作,该操作是WCF应用程序中服务协定的一部分)。最终,如下代码所示:
[ServiceContract]
public interface IGetServerInfo
{
[OperationContract]
string GetServerTime(); [OperationContract]
string GetServerName();
}
三、实现服务契约
刚刚我们已经在Contracts项目中创建好了一个IGetServerInfo
的契约,现在我们需要到Services项目中创建一个GetServerInfoService类
实现,该类继承IGetServerInfo
进行实现即可,我编写了如下代码进行演示,分别实现了获取服务器当前时间、获取服务器的名称(我这里为了演示直接返回"Server Name:wxzzz"
字符串给客户端)。
public class GetServerInfoService:IGetServerInfo
{
public string GetServerTime()
{
return DateTime.Now.ToString();
} public string GetServerName()
{
return "Server Name:wxzzz";
}
}
四、启动WCF服务
WCF服务可以自己创建程序监听服务,也可以寄宿于IIS提供服务。咱们这里先使用自己的程序进行WCF服务监听。
WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成。
- 地址(Address):地址决定了服务的位置;
- 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等;
- 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。
基于这些技术基础知识,下面是我在项目Hosting中编写的WCF服务代码块。
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(GetServerInfoService)))
{
host.AddServiceEndpoint(typeof(IGetServerInfo), new WSHttpBinding(), "http://127.0.0.1:9999/getserverinfoservice");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/getserverinfoservice/metadata");
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate
{
Console.WriteLine("GetServerInfoService已经启动,按任意键终止服务!");
}; host.Open();
Console.Read();
}
}
在上面提供的服务寄宿代码中,我们为创建的ServiceHost
添加了ServiceMetadataBehavior
,并采用了基于HTTP-GET的元数据获取方式,元数据的发布地址通过ServiceMetadataBehavior
的HttpGetUrl指定。在调用ServiceHost
的Open
方法对服务成功寄宿后,我们可以通过该地址获取服务相关的元数据。在浏览器的地址栏上键入http://127.0.0.1:9999/getserverinfoservice/metadata,你将会得到以WSDL形式体现的服务元数据,如下图所示。
权限问题:
如果无法启动该WCF服务,并提示错误:其他信息: HTTP 无法注册 URL http://+:9999/getserverinfoservice/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)。
遇到这种问题时,将Visual Studio关闭,然后用管理员方式启动Visual Studio打开项目即可。
五、客户端调用WCF服务
我们编写的WCF服务成功运行后,这时我们就可以使用客户端来访问服务端了(前提是服务端一定是在运行状态)。那么在客户端如何调用我们编写的WCF服务呢,其实很简单,我们一步一步来操作。
1.在Client项目中引用单击鼠标右键,选择添加服务引用,如图所示:
然后弹出界面,我们在地址栏填写http://127.0.0.1:9999/getserverinfoservice/metadata然后单击“转到”按钮,即可看见我们的服务,如图所示:
然后单击确定即可,此时服务就已经引用成功了。此时我们需要编写客户端代码运行试试看,能否得到我们的期望的结果,Client项目中控制台代码如下所示:
static void Main(string[] args)
{
ServiceReference1.GetServerInfoClient client = new ServiceReference1.GetServerInfoClient();
string sTime = client.GetServerTime();
Console.WriteLine("服务器时间:" + sTime); string sName = client.GetServerName();
Console.WriteLine("服务器名称:" + sName); Console.Read();
}
编写完成后,运行(WCF服务端一定要开启)试试看,运行效果如下所示:
嗯,这样我们基本上就完成了WCF服务端与客户端的简单示例。
实际上在WCF中还有非常非常多的功能、扩展、细节配置等,将在后面的文章中继续陈述。
本文示例源码下载:WCFDemo
C# 编写WCF简单的服务端与客户端的更多相关文章
- WCF心跳判断服务端及客户端是否掉线并实现重连接
WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...
- (C#:Socket)简单的服务端与客户端通信。
要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...
- 关于一个WCF调用的服务端和客户端的配置信息集合
客户端的配置我知道. 但是: httpTransport maxReceivedMessageSize="2147483647" <dataContractSerialize ...
- Java WebService 简单实例-服务端和客户端
转载自ITeye:https://www.iteye.com/topic/1135747/
- WCF开发的流程-服务端和客户端之间的通讯(内含demo讲解)
讲解技术之前,恳请博友让我说几句废话.今天是我第一在博客园发布属于自己原创的博文(如有雷同,那是绝对不可能的事,嘿嘿).之前一直是拜读各位博友的大作,受益匪浅的我在这对博友们说声谢谢,谢谢你们的共享! ...
- eureka服务端和客户端的简单搭建
本篇博客简单记录一下,eureka 服务端和 客户端的简单搭建. 目标: 1.完成单机 eureka server 和 eureka client 的搭建. 2.完成eureka server 的添加 ...
- [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接
原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...
- socket编程,简单多线程服务端测试程序
socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...
- winsock 编程(简单客户&服务端通信实现)
winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if Server receive the message, ...
随机推荐
- python ---12 生成器 推导式
一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器 一个一个的创建对象 节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数 2. ...
- log4j的基本使用方法
本文转载自http://www.codeceo.com/article/log4j-usage.html 一.基本用法 1.log4j需要jar包log4j-1.2.14.jar,链接: http:/ ...
- noip模拟【noname】
noname [问题描述] 给定一个长度为n的正整数序列,你的任务就是求出至少需要修改序列中的多少个数才能使得该数列成为一个严格(即不允许相等)单调递增的正整数序列,对序列中的任意一个数,你都可以将其 ...
- CentOS7 时间设置与网络同步
1.查看时区 [root@localhost /]# date -R Thu, Jul :: + +0800表示东八区,这边就不用再设置 时区中的CST表示中国标准时间. 时区相关共享文件在/usr/ ...
- 【做题】zoj3649 Social Net——倍增
这题是吴老师推荐的,于是我就去做了. 根据题意,在完成最大生成树后,对于树上从x到y的一条路径,求出最大的ck-cj(j<=k,ci为路径上第i个点的权值). 我一开始的想法是二分,记路径xy的 ...
- 【第十七章】 springboot + devtools(热部署)
技术介绍 devtools:是boot的一个热部署工具,当我们修改了classpath下的文件(包括类文件.属性文件.页面等)时,会重新启动应用(由于其采用的双类加载器机制,这个启动会非常快,如果发现 ...
- 如何规避Adobe Flash Player中重橙网络的广告弹窗
具体解决之道,参见卡饭论坛风之咩的帖子:https://bbs.kafan.cn/thread-2123485-1-1.html
- 【前端开发工具】WijmoJS 2018 v3 正式发布,全面支持Angular7
WijmoJS(前端开发工具包)2018年度第三个大版本已经正式发布,本次更新除了全面支持Angular7之外,还允许用户使用Web Workers在前端更高效地导出PDF.智能的分组表头属性.全新的 ...
- PTA 7-1 畅通工程之局部最小花费问题(35 分)
7-1 畅通工程之局部最小花费问题(35 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的 ...
- ssh中的 Connection closed by ***
另一台电脑的 mac/windows10/win7 都可以连接,就这台电脑不可以,但是能 ping 通, ssh 时总是 Connection reset by xxx 或 Connection cl ...