WCF(一)
在学习WCF之前要知道几个术语:

一:终结点
终结点由3个要素组成:契约,绑定,地址。
1.契约:契约属于一个服务公开接口的一部分。一个服务的契约,定义了服务端公开的服务方法,使用的传输协议,可访问的地址,传输的消息格式等内容。基本上,契约的定义描述了该服务的功能和作用,他告诉SOA系统中的其他结点这个服务是“干什么”的。常见的契约有:服务契约,数据契约,消息契约,错误契约。
2.绑定:定义了服务与外部通信的方式。它由一组称为绑定元素的元素构造而成,这些元素组合在一起以形成通信基础结构。一个绑定可以包含以下内容。
@1:通信所使用的协议,如HTTP,TCP,P2P等
@2:消息编码方式,如纯文本,二进制编码,MTOM等
@3:通信安全保障策略
@4:通信堆栈的其他任何要素
3.地址:每个服务都具有唯一的地址。
二:宿主
服务必须承载于某个进程中。意思是要想使服务能够正常工作,必须为服务提供一个宿主。
接下来看一个完整的Demo
//服务契约
[ServiceContract]
interface IService
{
[OperationContract]
string HelloWorld(string name);//服务操作
}
public class Service : IService
{
public string HelloWorld(string name)
{
return name + "说:HelloWorld";
}
}
/// <summary>
/// 宿主程序,封装了ServiceHost和其构造过程
/// </summary>
public class MyServiceHost : IDisposable
{
private ServiceHost _myHost;//提供服务的主机
public const string BaseAddress = "net.pipe://localhost";//基地址
public const string HelloWorldServiceAddress = "HelloWorld";//可选地址
//服务契约定义的类型
public static readonly Type ContractType = typeof(ConsoleAppWCF.IService);
//服务契约实现的类型
public static readonly Type ServiceType = typeof(ConsoleAppWCF.Service);
//绑定:指定客户端和服务端之间的通信所使用的协议
public static readonly Binding HelloWorldBinding = new NetNamedPipeBinding(); /// <summary>
/// 构造ServiceHost对象
/// </summary>
public void ConstructServiceHost()
{
_myHost = new ServiceHost(ServiceType, new Uri[] {
new Uri(BaseAddress)
});
_myHost.AddServiceEndpoint(ContractType, HelloWorldBinding, HelloWorldServiceAddress);
}
/// <summary>
///ServiceHost只读属性
/// </summary>
public ServiceHost Host
{
get
{
return _myHost;
}
}
/// <summary>
/// 打开服务
/// </summary>
public void Open()
{
Console.WriteLine("启动服务中...");
_myHost.Open();
Console.WriteLine("服务已经启动...");
}
public MyServiceHost()
{
ConstructServiceHost();
}
/// <summary>
/// 实现接口IDisposable的方法
/// </summary>
public void Dispose()
{
if (_myHost != null)
(_myHost as IDisposable).Dispose();
}
}
打开服务
static void Main(string[] args)
{
using (MyServiceHost host = new MyServiceHost())
{
host.Open();
Console.Read();
} }
接下来客户端代码
[ServiceContract]
public interface IService
{
[OperationContract]
string HelloWorld(string name);
}
/// <summary>
/// 客户端代理
/// </summary>
public class HelloWorldProxy : ClientBase<IService>, IService
{
public static readonly Binding helloWorldBinding = new NetNamedPipeBinding();
public static readonly EndpointAddress helloWorldAddress =
new EndpointAddress(new Uri("net.pipe://localhost/HelloWorld"));
public HelloWorldProxy() : base(helloWorldBinding, helloWorldAddress)
{ }
public string HelloWorld(string name)
{
return Channel.HelloWorld(name);
}
}
客户端启动代码
static void Main(string[] args)
{
using (HelloWorldProxy proxy = new HelloWorldProxy())
{
Console.WriteLine(proxy.HelloWorld("小猫"));
Console.Read();
}
}
注意:这是两个控制台程序,先启动服务端,在启动客户端。
参考书献:精通C#5.0与.net 4.5高级编程,作者:丁士锋 清华出版社。图书馆借的书,嘻嘻
WCF(一)的更多相关文章
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- 【WCF】使用“用户名/密码”验证的合理方法
我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...
- 【WCF】错误协定声明
在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...
- 【WCF】自定义错误处理(IErrorHandler接口的用法)
当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...
- [WCF]缺少一行代码引发的血案
这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- C# 用SoapUI调试WCF服务接口(WCF中包含用户名密码的验证)
问题描述: 一般调试wcf程序可以直接建一个单元测试,直接调接口. 但是,这次,我还要测试在接口内的代码中看接收到的用户名密码是否正确,所以,单一的直接调用接口方法行不通, 然后就想办法通过soapU ...
- WCF基础
初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...
- Mono下的WCF的Bug?
最近一段时间,一直在折腾Mono,折腾Linux.让我无比痛苦的是Mono下的WCF的坑真的是太多了,这不又遇到了一个莫名其妙的问题. 环境:mono 3.2.1,Jexus 5.4.3,OS Cen ...
随机推荐
- while和do-while
1. While(条件表达式){ 只要条件表达式结果为true,循环一直执行,当条件表达式结果为false的时候,循环终止 } 2. Do{ 循环体代码:首先执行该循环体代码一次.如果while后边的 ...
- 对于之间不平凡的我,为什么会选择IT!(上)
我相信有很多小伙伴看了我发布的文章后,不知道对大家有无启发,在这里我都非常感谢大家的收看,因为现在收疫情影响,我也看到很多朋友私信我,看你经历这么多是经历了什么,如果大家在上一篇发现的时候会看见我父亲 ...
- 3d模型一般怎么导入到到Threejs中使用
这是我之前做的一个demo,导入的3d模型文件是obj格式的,需要使用OBJLoader和MTLLoader, mtl文件用于描述多边形可视面貌的材质如果你可以导出obj.mtl文件的话,那么就可以使 ...
- 杭电1080 J - Human Gene Functions
题目大意: 两个字符串,可以再中间任何插入空格,然后让这两个串匹配,字符与字符之间的匹配有各自的分数,求最大分数 最长公共子序列模型. dp[i][j]表示当考虑吧串1的第i个字符和串2的第j个字符时 ...
- 数据结构与算法--二分搜索(binary search)
前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...
- 1、flink介绍,反压原理
一.flink介绍 Apache Flink是一个分布式大数据处理引擎,可对有界数据流和无界数据流进行有状态计算. 可部署在各种集群环境,对各种大小的数据规模进行快速计算. 1.1.有界数据流和无界 ...
- iOS appium
1.如果没有安装过Homebrew,先安装homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ ...
- bootstrop日历
https://blog.csdn.net/cuixiaobo521/article/details/77880633
- 20199310《Linux内核原理与分析》第十五周作业 Linux安全实验
1 补充知识 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭, ...
- kubernetes (一)使用Rancher搭建集群
目录 如何快速高效部署K8s集群 Rancher是什么 为什么是Rancher 1.0.安装Rancher 1.1.环境 1.2.选择Rancher版本 1.3.拉取镜像 2.0.容器启动高级选项 2 ...