WCF学习笔记
文章平均质量分 79
peterzeng20210530
shopify新道路
展开
-
WCF压力测试工具
<br />最近几天由于工作的需要,自己做啦一个WCF的压力测试程序;<br />主要测试指标:<br />1)平均每秒事务处理数;<br />2)平均事务反应时间;<br />3)压力机和服务器计数器;<br /> <br />采用的是多线程来模拟并发;<br /> <br />主要问题是,在线程开到200个时,压力机CPU占用达到90%以上;<br /> <br />不知道哪位仁兄有没有有好的办法;<br /> <br />另外,假如通过WCF Channel直接给服务端发送Message,压力机压力也原创 2010-08-24 13:53:00 · 5524 阅读 · 1 评论 -
Self Hosting WCF Service : Block IP
WCF 3.5 终于能获取客户端信息了,现在我们可以为 "Self Hosting"、"Windows Services Hosting" 补充一些额外的功能。class BlockIP{ static BlockIP() { Instance = new BlockIP(); } private BlockIP() { IPs = new HashSet(); }转载 2009-01-17 16:56:00 · 711 阅读 · 0 评论 -
WCF - 只读属性
在设计数据实体(Entity)时,某些属性必须是只读的,比如 CreateTime、LastLogonTime 等。但 DataContract 并不允许我们这么做。[DataContract]public class Data{ private int x; public Data() { x = new Random(DateTime.Now.Millisecond).Next转载 2009-01-17 16:47:00 · 1152 阅读 · 0 评论 -
[WCF Transaction] 3. 事务投票
我们知道事务是通过参与方进行投票(Voting)来决定 "提交(Complete)" 或者 "回滚(Rollback)"操作的。默认情况下,WCF 通过 OperationBehavior(TransactionAutoComplete = true)来完成投票动作。(TransactionAutoComplete = true 是缺省值,不需要显式声明。)我们还是使用第 2 章的例子,将转载 2009-01-17 16:43:00 · 655 阅读 · 0 评论 -
[WCF Security] 4. 用户名/密码身份验证
X.509 比较适合验证 "客户机" 的身份,而另外一方面,我们可能需要针对具体的 "用户" 进行验证。本文将记述基于 "用户名/密码" 方式的身份验证开发步骤。1. 服务器数字证书我们同样需要为服务器准备一个数字证书。D:/>makecert -r -pe -n "CN=MyServer" -ss My -sky exchange 2. 创建服务[ServiceContract]pu转载 2009-01-17 16:40:00 · 966 阅读 · 0 评论 -
[WCF Security] 1. 基本概念
WCF Security 主要包括 "Transfer Security"、"Access Control"、"Auditing" 几个部分。1. Transfer SecurityTransfer Security 主要包括三个方面: "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authe转载 2009-01-17 16:37:00 · 648 阅读 · 0 评论 -
WCF - ConcurrencyMode
和 ServiceThrottlingBehavior 控制整个 ServiceHost 不同,ServiceBehavior.ConcurrencyMode 用于控制具体服务对象的并发行为。ConcurrencyMode: Single: 默认方式。服务实例是 single-threaded,不接受重入调用(reentrant calls)。也就是说对于同一个服务实例的多个调用必须排队,转载 2009-01-17 16:21:00 · 1139 阅读 · 0 评论 -
WCF - Callback
Callback 机制又被称之为 "duplex call",说白了就是在原有基础上,为客户端也添加一个服务端点,让服务器能调用这个客户端"服务",从而实现所谓的回调机制。也正因为如此,通讯 binding就必须支持双向通讯能力(bidirectional-capable),通常我们会选择WSDualHttpBinding、NetTcpBinding 以及 NetNamedPipeBi转载 2009-01-17 16:19:00 · 2658 阅读 · 0 评论 -
WCF - IsOneWay 和异步的区别
在某些博客文章里,直接将 IsOneWay 称为"异步方法"。虽然多数时候不会对开发带来什么问题,但深究起来,这两者是不同的。接下来,我们做个试验。将同一个服务契约分别用 IsOneWay和异步进行实现,客户端使用多线程模拟并发调用,并使用 ServiceThrottlingBehavior (也可以使用InstanceContextMode.Single) 进行并发控制。注意对比输出转载 2009-01-17 16:16:00 · 7110 阅读 · 0 评论 -
WCF - ChannelFactory
在学习和测试 WCF 的时候,我通常使用 ChannelFactory 来代替 Client Proxy。原因是方便,无须创建多个Project / Class。当然,在正式开发中还是使用 Client Proxy 要好些,毕竟 ChannelFactory直接依赖于契约,违背了 SOA 边界隔离的原则。使用 ChannelFactory 很简单,但完成方法后要及时调用 Close 或 D转载 2009-01-17 15:18:00 · 1084 阅读 · 0 评论 -
[WCF 学习笔记] 9. 端点绑定
Endpoints 包含了重要的地址信息,包括服务地址以及通讯协议,客户端只有获知这些信息才能与服务建立通讯。而 Binding用于指定 WCF 两个端点(endpoint)之间的通讯细节,两个端点的 Binding应该是一致的。端点和绑定对象合作,共同完成服务通讯和调用。服务面对的客户端是多样的,不同的客户端可能选择不同的通讯方式,不同的安全方案。WCF允许我们为服务添加多个绑定和端转载 2009-01-17 15:07:00 · 1095 阅读 · 0 评论 -
WCF Essentials (6)
9. 客户端编程在调用服务操作之前,客户端必须导入服务契约。如果客户端同样使用 WCF环境,那么通常的做法是使用代理。代理是一个拥有与服务契约相同接口样式的 CLR类(class)。如果服务实现了多个契约,那么客户端需要为每个契约类型生成一个代理。代理除了提供和服务契约相同的操作方法外,还拥有一些附加方法完成诸如代理生命周期管理、服务连接等操作。代理完整囊括了服务的各个方面:服务定位、转载 2009-01-17 16:53:00 · 619 阅读 · 0 评论 -
WCF Essentials (4)
7. 宿主 (Hosting)WCF 服务不能生存于虚空之中,它必须寄宿在一个被称之为 "宿主进程(hostprocess)" 的 Windows 进程里。每个宿主进程可以寄宿多个服务,每种服务也可以在宿主进程中寄宿多次(地址不能相同)。WCF并没有明确规定宿主进程不能是客户端进程,但基于错误和安全隔离等原因,我们更提倡将其和客户端相分离。另外对于宿主进程的类型也没有过多的限制,它可以转载 2009-01-17 16:51:00 · 646 阅读 · 0 评论 -
[WCF 学习笔记] 3. 消息交换
客户端和服务之间通过消息交换(Message Exchange)来完成方法调用和数据传递,WCF 定义了 3 种消息交换模式。1. Request/Reply这是缺省模式,又被称之为同步调用。在调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型。[ServiceContract]public interface IContract{ [OperationContract]转载 2009-01-17 14:56:00 · 639 阅读 · 0 评论 -
[WCF 学习笔记] 5. 异常处理
WCF 将服务异常(Exception)转换成 SOAP faults,传递到客户端后再次转换成 Exception。只不过缺省情况下,我们很难从中获取有意义的信息。[ServiceContract]public interface ICalculate{ [OperationContract] int Add(int a, int b);}public class CalculateSe转载 2009-01-17 15:00:00 · 1197 阅读 · 0 评论 -
RESTful WCF
REST 最近很热门…… WCF 3.5 增加了对 REST 的支持 —— System.ServiceModel.Web。对我而言 REST 并不是用来取代 WebService/WCF 的,它更多的是一种架构层面而非技术层面的概念和标准。使用唯一资源定位地址 URI,加上 HTTP 请求方法从而达到对一个发布于互联网资源的唯一描述和操作。这会带来很多好处:1. 资源的唯一性对下面这两个 URI转载 2009-01-17 16:54:00 · 1749 阅读 · 0 评论 -
WCF Essentials (3)
6. 端点 (Endpoints)每个服务都会关联到一个用于定位服务位置的地址(Address),一个用于定义如何与服务进行通讯的绑定(Binding),以及一个告知客户端服务能做什么的契约(Contract),这三样共同组成了服务的助记符 ——ABC。WCF 以端点(Endpoint)这样一个形式来体现三者的关系,端点本身就是地址、契约和绑定的组合体。端点示意图每个端点都必须转载 2009-01-17 16:50:00 · 622 阅读 · 0 评论 -
WCF Essentials (2)
[最后修改由 yuhen, 于 2007-10-20 18:36:38]转载 2009-01-17 16:49:00 · 531 阅读 · 0 评论 -
WCF Essentials (1)
本文是对 Juval Lowy《Programming WCFServices》第一章的简要翻译。当然,为了照顾中文书写和阅读习惯,翻译文字和原文并非一一对应的。也许是《MSDN中文版》或者国内其他一些翻译书籍给我带来的坏印象,我非常小心重新组织文字,避免出现那些让人看不懂的机器译文。本文只是个人学习笔记,雨痕完全尊重原文作者的全部权益,不持有本文的任何版权,转载时请注明原文作者。1.转载 2009-01-17 16:48:00 · 779 阅读 · 0 评论 -
[WCF MSMQ] 2. 队列与事务
MSMQ 支持两种类型的队列,事务性队列(transactionalqueue)会将消息持久(persiste)存储到磁盘中,即便服务器当机(shutdown)、重启(reboot)或崩溃(crash),消息依然可以在系统恢复后被读取。同时,消息发布、获取和删除都在环境事务范围内,从而确保消息的可靠性。我们还可以使用 TransactionScope将环境事务传递给队列,否则队列会自动转载 2009-01-17 16:46:00 · 1697 阅读 · 0 评论 -
[WCF Transaction] 4. 事务与会话
我们看下面的例子。[ServiceContract(SessionMode = SessionMode.Required)]public interface IService{ [OperationContract] [TransactionFlow(TransactionFlowOption.Allowed)] void Test();}[ServiceBehavior(Instanc转载 2009-01-17 16:45:00 · 626 阅读 · 0 评论 -
[WCF Security] 3. X509 身份验证
个人认为在 Intranet / Internet 环境下,最方便的认证方式应该是 X.509 数字证书。当然,还有一个原因是我用 Windows Authentication 从来没成功过。以下我们详细描述如何创建 "Certificate Authentication"。1. 创建数字证书一般情况下,我们为服务器以及每个客户端都单独创建一个服务器,以便标识其唯一身份。创建数字证书时,必须添加转载 2009-01-17 16:38:00 · 1446 阅读 · 1 评论 -
WCF - MaxStringContentLength & MaxReceivedMessageSize
一个很经典的 "问题" ~~~~ 先看下面的例子。[ServiceContract]public interface IService{ [OperationContract] void Test(string s);}public class Service : IService { public void Test(string s) { Console.WriteLine(转载 2009-01-17 16:31:00 · 2197 阅读 · 0 评论 -
WCF - Stream
WCF 支持传送二进制流数据,但有一定的限制。 只有 BasicHttpBinding、WebHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 支持传送流数据。 流数据类型必须是可序列化的 Stream 或 MemoryStream。 传递时消息体(Message Body)中不能包含其他数据。 我们先看看下面的例子。注意将 B转载 2009-01-17 16:22:00 · 1973 阅读 · 0 评论 -
WCF - IDisposable
WCF 释放服务对象时会检查该对象是否实现了 IDisposable 接口,并适时调用 Dispose方法,以便服务对象能及时回收相关资源。但有一点要注意,Dispose方法是被异步调用的,也就是说它被扔到系统线程池中执行,且无法获得上下文对象。看下面的例子。[ServiceContract(SessionMode=SessionMode.Required)]public interf转载 2009-01-17 16:10:00 · 703 阅读 · 0 评论 -
WCF - 释放服务对象实例
虽然通过设置 ServiceBehavior.InstanceContextMode 特性或关闭客户端代理可以达到释放服务对象的目的,但某些时候我们可能希望获得更好的主动权。1. ReleaseServiceInstance这应该是最直接的方式了。看下面例子的输出结果,我们可以看到在客户端代理对象释放之前,服务实例就被释放了。[ServiceContract(SessionMode = Ses转载 2009-01-17 15:32:00 · 1634 阅读 · 0 评论 -
[WCF 学习笔记] 11. 配置文件
WCF 的配置文件并不复杂,相对于手工编写配置文件,我更倾向于使用 SDK 所附带的工具 —— "Service Configuration Editor"。使用这个工具,我们可以非常方便地创建或修改服务器和客户端的配置文件。 WCF 配置文件基本元素: for example, --> elements. -->转载 2009-01-17 15:12:00 · 676 阅读 · 1 评论 -
[WCF MSMQ] 1. 基本应用
MSMQ 的好处,微软的相关文档里长篇累牍说了很多,无需我再补充什么。对我而言,比较看重它的离线处理能力,在某些场合这个功能非常有用。加上 MSMQ 3.0 多路广播能力,实在没有理由不吸引我。由于消息队列异步处理特征,因此在 Queued Contracts 中,我们只能使用 IsOneWay = true 的OperationContract,且不能使用 Fault Contracts转载 2009-01-17 16:46:00 · 1162 阅读 · 0 评论 -
[WCF Security] 2. 安全参数设置
1. 安全方式通过设置 Binding 的属性 Security 来实现。NetTcpBinding binding = new NetTcpBinding();binding.Security.Mode = SecurityMode.Transport;binding.Security.Transport.ProtectionLevel = System.Net.Security.Prote转载 2009-01-17 16:37:00 · 1124 阅读 · 1 评论 -
WCF - SecurityNegotiationException
将 WCF 服务器和客户端分别部署到不同机器上,可能会触发如下异常。未处理 System.ServiceModel.Security.SecurityNegotiationException Message="服务器已拒绝客户端凭据。" Source="mscorlib"解决方法,就是调整服务器端 Binding 的安全方式,比如设为 "None"。NetTcpBinding bi转载 2009-01-17 16:35:00 · 1313 阅读 · 0 评论 -
[WCF Transaction] 2. 事务演示
下面的代码演示了典型的 Client/Services Distributed Transaction。// -------- Service1 -----------------[ServiceContract]public interface IService1{ [OperationContract] [TransactionFlow(TransactionFlowOption.Al转载 2009-01-17 16:42:00 · 552 阅读 · 0 评论 -
[WCF Transaction] 1. 基本概念
WCF 支持分布式事务,也就是说事务可以跨越服务、进程、机器边界,在多个服务和客户端间存在。Single service/single resource transactionDistributed transactional service-oriented applicationTransaction Binding只有 TCP-、 IPC- 以及 WS-related 等 B转载 2009-01-17 16:41:00 · 695 阅读 · 0 评论 -
WCF - IErrorHandler
使用 IErrorHandler 接口,我们可以更深入地参与到 WCF 的异常处理过程当中。我们甚至可以改变异常消息细节,而不仅仅是做些错误记录。public interface IErrorHandler{ void ProvideFault(Exception error, MessageVersion version, ref Message fault); bool HandleE转载 2009-01-17 16:28:00 · 943 阅读 · 0 评论 -
WCF - IErrorHandler
使用 IErrorHandler 接口,我们可以更深入地参与到 WCF 的异常处理过程当中。我们甚至可以改变异常消息细节,而不仅仅是做些错误记录。public interface IErrorHandler{ void ProvideFault(Exception error, MessageVersion version, ref Message fault); bool HandleE转载 2009-01-17 16:26:00 · 685 阅读 · 0 评论 -
WCF - FaultException
在 WCF 中,客户端调用服务时,可能抛出的异常有以下三种类型。1. 通讯异常。诸如网络错误,地址错误,服务器没有启动等等。这类异常多是 CommunicationException (或其具体继承类型)。2. 状态异常。比如访问了已经关闭的代理对象,契约错误,以及安全设置错误等。常见的有 ObjectDisposedException。3. 服务异常。由服务器触发,多是 FaultExcepti转载 2009-01-17 16:25:00 · 1818 阅读 · 1 评论 -
WCF - 枚举类型
通常情况下,我们无需做任何设置就可以在 WCF 中使用枚举类型。public enum DataType{ A, B, C}[ServiceContract]public interface IMyService{ [OperationContract] void Test(DataType d);}客户端代理//-------------------------------转载 2009-01-17 15:29:00 · 1250 阅读 · 0 评论 -
WCF - DataContract 继承
DataContract 支持继承方式,但和我们前面所提到的 ServiceContract 一样,有点小小的问题。看下面的例子。(为显示方便,以下代码有删减。)[DataContract]public class Data{ [DataMember] public int X;}[DataContract]public class Data2 : Data{ [DataMember]转载 2009-01-17 15:26:00 · 4672 阅读 · 0 评论 -
WCF - DataContractSerializer
WCF 缺省情况下使用 DataContractSerializer 序列化引擎,多数时候我们并不关心它怎么运作,不过有些小技巧还是有必要知道的。1. DataContractSerializer 同样支持 Serializable。[Serializable]public class Data{ public int X;}DataContractSerializer serializer转载 2009-01-17 15:24:00 · 1449 阅读 · 0 评论 -
WCF - ServiceContract 继承
ServiceContract 支持继承的好处是我们可以在不影响现有客户端的情况下自由扩展服务的功能。本文的目的是了解一下继承的一些细节问题。(注:为了显示方便,以下演示代码中作了些删减。)演示原型:服务器端代码[ServiceContract]public interface IMyService{ [OperationContract] int Add(int a, int b);}p转载 2009-01-17 15:21:00 · 1698 阅读 · 1 评论 -
[WCF 学习笔记] 13. 分布事务
WCF 对分布事务提供了良好的支持,这使得我们可以协调多个服务之间的数据完整性。通过TransactionFlowAttribute、ServiceBehaviorAttribute 和OperationBehaviorAttribute 这三个特性,我们可以很好地控制事务的相关细节。TransactionFlowAttribute 的构造参数 "TransactionFlowOption转载 2009-01-17 15:17:00 · 562 阅读 · 0 评论