WCF客户端和服务的实现
WCF客户端和服务
?服务器端:
– 定义和实现服务契约
– 为服务类型构建ServiceHost实例,暴露endpoints
– 打开通讯通道
?客户端:
– 需要服务契约的一个副本和关于endpoints的信息
– 为特定的endpoint构建通信通道并且调用操作

客户端的客户进程中,有一个代理,该代理主要功能是完成客户进程和主机进程之间的通信。Proxy并不直接和主机的Endpoint通信,而是由客户端自己提供一个Endpoint和主机的Endpoint通信。
服务端有一个主机Host,提供服务,服务由Endpoint向外发布接口。
消息的通信由两端的Endpoint通信。
代码示例:
服务端代码
using System;
using System.ServiceModel;
namespace HelloIndigo
{
[ServiceContract(Namespace="http://www.monkeyfu.net")]
public interface IHelloIndigoService
{
[OperationContract]
string HelloIndigo(string message);
}
public class HelloIndigoService : IHelloIndigoService
{
#region IHelloIndigoService Members
public string HelloIndigo(string message)
{
return string.Format("Receivied message at{0}:{1}", DateTime.Now, message);
}
#endregion
}
}
此处主要定义了服务契约。在WCF中,定义一个契约使用的是ServiceContract。只有定义了OperationContract的方法才会被放入服务中。
宿主程序
通常情况,服务宿主程序需要使用ServiceHost类,当使用IIS或者WAS作为宿主程序的时候IIS和WAS会自动创建ServiceHost类型。当自定义宿主服务的时候,需要手动创建ServiceHost对象。
namespace Host
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))//手动创建ServiceHost
{
host.AddServiceEndpoint(typeof(HelloIndigo.IHelloIndigoService), new NetTcpBinding(), "net.tcp://localhost:9009/HelloIndigo");
host.Open();
Console.ReadLine();
}
}
}
}
客户端
客户端的契约要和服务端的保持一致
namespace Client
{
//和服务端的契约定义要一致。
[ServiceContract(Namespace = "http://www.monkeyfu.net")]
public interface IHelloIndigoService
{
[OperationContract]
string HelloIndigo(string message);
}
class Program
{
static void Main(string[] args)
{
IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:9009/HelloIndigo"));
string s = proxy.HelloIndigo("Hello from client...");
Console.WriteLine(s);
Console.ReadLine();
}
}
}
Endpoint
Endpoint实际上由ABC三个要素组成Address,Binding,Contract

使用配置文件实现服务和Endpoint
前面的方法是通过手工编程实现的,事实上,可以不用写代码而通过配置文件实现服务调用。
只使用代码而不用配置文件的情况不适合IIS为宿主的情况,IIS宿主必须使用配置文件配置WCF的ServiceHost。
主要步骤如下:
配置Host的配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="HelloIndigo.HelloIndigoService" behaviorConfiguration="serviceBehavior">
<endpoint binding="basicHttpBinding" contract="HelloIndigo.IHelloIndigoService" address="HelloIndigo" />
<endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8008"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
配置完毕后,宿主代码可以如下写法, 不再需要添加endpoint
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService)))//手动创建ServiceHost
{
//host.AddServiceEndpoint(typeof(HelloIndigo.IHelloIndigoService), new NetTcpBinding(), "net.tcp://localhost:9009/HelloIndigo");
host.Open();
Console.ReadLine();
}
}
为客户端添加Service Reference。对于客户端代码,可以不必要再写契约定义,因为添加完Service Reference之后,系统自动生成很多相关代码。按如下方法写即可。
添加完毕后可以适当修改app.config
namespace Client
{
////和服务端的契约定义要一致。
//[ServiceContract(Namespace = "http://www.monkeyfu.net")]
//public interface IHelloIndigoService
//{
// [OperationContract]
// string HelloIndigo(string message);
//}
class Program
{
static void Main(string[] args)
{
//IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:9009/HelloIndigo"));
Client.ServiceReference1.HelloIndigoServiceClient proxy = new Client.ServiceReference1.HelloIndigoServiceClient();
string s = proxy.HelloIndigo("Hello from client...");
Console.WriteLine(s);
Console.ReadLine();
}
}
}
本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/572975,如需转载请自行联系原作者
WCF客户端和服务的实现的更多相关文章
- WCF初探-10:WCF客户端调用服务
创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...
- WCF系列教程之WCF客户端调用服务
1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...
- WCF客户端获取服务端异常[自定义异常]
引言 经过不断的摸索,询问/调试,终于学会了关于WCF客户端与服务端之间异常的处理机制,在此来记录自己的成果,用于记录与分享给需要的伙伴们. 首先感谢[.NET技术群]里群主[轩]的大力帮助,如有需要 ...
- WCF 客户端与服务端消息传输
WCF很多需要认证信息,保证服务的安全,可以使用消息来实现 WCF 实现消息的方式: WCF中有两个接口: IClientMessageInspector [定义一个消息检查器对象,该对象可以添加到 ...
- WCF 客户端调用服务操作的两种方法
本节的主要内容:1.通过代理类的方式调用服务操作.2.通过通道的方式调用服务操作.3.代码下载 一.通过代理类的方式调用服务操作(两种方式添加代理类) 1.手动编写代理类,如下: 客户端契约: usi ...
- WCF客户端与服务端通信简单入门教程
服务端 1.新建空白解决方案,然后再空白解决方案中新建:WCF服务应用程序.建完后如图: 2.删掉自动生成的IService1.cs和Service.svc并添加WCF服务文件StudentServi ...
- WCF客户端和服务端配置
服务端: <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samp ...
- WCF初探-11:WCF客户端异步调用服务
前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...
- WCF初探-13:WCF客户端为双工服务创建回调对象
前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...
随机推荐
- 用SQL*Plus命令启动和关闭数据库
用SQL*Plus命令启动和关闭数据库 1.启动方式 starup或startup open startup nomount startup mount startup read only [x] s ...
- Hadoop(一)基本简介
是一个由Apache基金会所开发的分布式系统基础架构. 广义上来说,是一个Hadoop生态圈(由一堆框架.软件组成) 版本介绍 分为社区版和商业版 1.x,2.x,-是并行发展的 1.x : 由一个分 ...
- C语言 文件复制
有很多人会问,学会C语言能干啥?,就只能控制台敲个数学题,做个界面都没有的贪吃蛇么? 刚开始的我,也是这样想的,但慢慢深入C语言后,我才领略到C的强大,C的万能.小到游戏破解,加解密算法,大到设备驱动 ...
- Python进度条模块tqdm实现任务进度可视化
一.前言 tqdm 是一个易用性强.扩展性高的 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息,我们只需要封装任意的迭代器 tqdm(iterator) 即可. 二.安装 ...
- redis中的分布式锁
分布式锁的实现场景 在平时的开发中,对于高并发的开发场景,我们不可避免要加锁进行处理,当然redis中也是不可避免的,下面是我总结出来的几种锁的场景 Redis分布式锁方案一 使用Redis实现分布式 ...
- Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统
Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手 来源: 博客园 发布时间: 2011-04-19 11:18 阅读: 1282 次 推荐: 0 ...
- CentOS8.1.1911正式发布!
前阵子,CentOS官方宣布:CentOS8.1.1911正式发布!已经安装CentOS8.0的朋友,可以执行yum update更新(笔者更新了2次),体验下新版本!如是新安装,可以从官方网站下载h ...
- Java包机制和Javadoc的使用
1.什么是包机制? 包(package)其实本质上就是一个文件夹,使用包是为了让相同类名的两个类可以使用,也就是操作系统中的文件夹,用来解决重名并且让相同的功能类放在同一个包,使开发更加有条理. 注意 ...
- PHP出现SSL certificate:unable to get local issuer certificate的解决办法
当本地curl需要访问https时,如果没有配置证书,会出现SSL certificate: unable to get local issuer certificate错误信息. 解决办法: 1.下 ...
- response没有实现跳转,而是提示浏览器下载文件
问题简述: web项目中,response没能实现重定向跳转网页,而是通知浏览器下载文件. 代码如下: response.getWriter().write("<h1 style='c ...