服务器中的错误记录类似于这种: 124.65.133.242 – – [27/Oct/2014:14:30:51 +0800] “-” 400 0 “-” “-” 124.65.133.242 – –...400错误,每次有大概连续出现1-6个不等,而且也并不是每次客户访问都会产生400错误。...但是经过本地抓包发现,chrome是没有向服务器发送异常请求或者数据包的。...对于这种情况,nginx是当做400错误来处理的,但由于连接已经关闭,错误信 息不会发送到客户端,这就产生了日志文件中记录了错误,而抓包分析中什么也看不到的现象。...像 LVS 之类什么的,也会引起这种问题,然后日志中会出现大量的 400 错误。
Single Single类似于单线程同步,在一个服务的调用期间会阻塞其他服务的调用 我们做如下的例子。我们建立了一个双工通信,服务的操作协定是单向的,回调的操作协定是请求答复(同步)的。...回调方法在每次调用都使用新实例,并且在回调方法中我们做了3秒的sleep,模拟通信延时。这时候我们连续多次调用服务。 ? ? ? ? 结果如图所示,在等待回调返回时出现了死锁 ?...因为我们在回调返回时,尝试访问服务对象。可是服务对象是单线程同步的,正在等待回调方法的返回,造成死锁。 现在我们尝试将回调方法的操作协定改为单向 ?...: 【WCF】服务并发中的“可重入模式” - 东邪独孤 - 博客园 ConcurrencyMode Enum (System.ServiceModel) - Microsoft Docs ---- 本文会经常更新...,请阅读原文: https://xinyuehtx.github.io/post/wcf%E5%85%A5%E9%97%A8-8.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
一、多次声明相同的错误明细类型 比如在下面的代码中,对于操作Divide,通过FaultContractAttribute特性对同一个错误明细类型CalculationError进行了两次设置。...服务端框架在初始化ServiceHost,并创建服务表述的时候(关于服务描述,以及在服务寄宿过程中对服务描述的创建,《WCF技术剖析(卷1)》的第7章有详细的介绍),会抛出如图1所示的InvalidOperationException...终结点获取以WSDL表示的服务元数据(Metadata)的时候就会出现问题。...也就是说,基于在某个操作方法上应用了XmlSerializerFormatAttribute特性,WCF会采用XmlSerializer作为所有参数和返回值的序列化器,对于出现异常指定的错误明细对象,依然采用默认的...在下面的代码中,我们将XmlSerializerFormatAttribute特性应用在服务契约的Divide操作上面,并将SupportFaults属性设为true。
而WCF将服务实例封装在一个称为实例上下文(InstanceContext)对象中,所以WCF中的并发指的是同一个服务实例上下文同时处理多个服务调用请求。...《WCF技术剖析(卷1)》的第9章对WCF的实例化机制进行了深入的剖析,从中我们知道在WCF服务端框架体系中,激活的服务实例并不是单独存在的,而是被封装在一个被称为实例上下文(InstanceContext...图1 通过一个InstanceContext对多个并发请求的处理 由于WCF的并发处理属于服务本身自身的行为,所以我们通过服务行为(Service Behavior)的形式对采取的并发策略进行控制,而不同的并发策略定义在相应的并发模式...在双向通信的场景中,如果多个服务端或者同一个客户端的多个并发的服务调用操作所指定的回调实例上下文(即封装回调操作的InstanceContext对象),就可能出现针对同一个InstanceContext...与通过将ServiceBehaviorAttribute特性应用到服务类型并指定采用的并发模式相类似,回调采用的并发模式通过应用在回调类型上的CallbackBehaviorAttribute特性来指定
这个特性没有出现在官方文档上面,至少在MSDN上的相关介绍依然是错误的。...一方面,我们期望WCF服务端能够处理尽可能多的并发请求,但是资源的有限性决定了并发量有一个最大值。...如果WCF不控制进入消息处理系统的并发量,试图处理所有抵达的并发请求,一旦超过了这个临界值,整个服务端将会由于资源耗尽而崩溃。...所以,我们需要在WCF的消息接收系统和消息处理系统之间设置一道道屏障,将流入消息处理系统的请求控制到一个最佳的范围,以实现对现有资源的有效利用,从而达到确保服务的可用性和提高整体吞吐量的目的。...增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能已经是更长超时的一部分。 四、WCF 4.0中三个限流默认阀值具体是多少呢?
服务调用的目的体现在对某项服务功能的消费上,而功能的实现又定义在相应的服务类型中。不论WCF服务端框架处理服务调用请求的流程有多么复杂,最终都落实在服务实例的激活和操作方法的执行上面。...WCF中的实例管理(Instance Management)旨在解决服务实例的激活和服务实例生命周期的控制。 会话(Session)的目的在于保持来自相同客户端(服务代理)多次服务调用之间的状态。...在WCF中,实例上下文不仅仅用于对回调对象的封装,也用于对真正服务实例的封装。...客户端正常调用服务端操作是一种服务调用;服务端回调客户端操作也可以看成是一种服务调用。因此,通过实例上下文对回调对象和服务实例进行封装本质上是一致的。 实例上下文对服务实例的封装大体可以通过图1表示。...对于接收到的服务调用请求,如果相应的实例上下文存在,则通过它得到服务实例来处理服务请求,否则创建服务实例并通过实例上下文对其进行封装,然后再通过实例上下文得到具体的服务实例进行服务请求处理。 ?
本文demo已上传至github:xinyuehtx/WCFdemo 这个博客会介绍如何设置服务的异常回馈 ---- 多进程之间调试,或者是客户端/服务器联调,很麻烦的一点是出了异常如何定位?...错误协定(FaultContract) 服务操作可以标记错误协定,表明这个方法可能会出现指定错误。 ?...可以看到异常成功输出 错误协定风险 聪明的同学都已经注意到,我们刚刚试验的操作协定是请求答复模式的(同步方法)。那么对于单向模式会如何呢? 我们尝试将IsOneWay设置为True ?...小结 我们研究了WCF服务的错误协定,其特点有 可以将服务端的指定错误回馈客户端,通过简单包装可以传递所有托管异常的基本信息 协定传递的对象需要可以被数据协定序列化 不能处理单向操作 参考链接: 如何:...post/wcf%E5%85%A5%E9%97%A8-9.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
Mono 3.0.2 基于双工通信的WCF应用 Demo 的讨论中 深蓝医生 提到了一个问题: 楼主,找了几天,终于明白我的程序错误在哪里了,在服务契约上加入下面的接口方法: [OperationContract...] double Sub(double x, double y); 这样客户端调用的时候,能够直接得到Sub方法的返回值,但同样功能的服务在mono 上面运行的时候,出现下面的错误...双工服务中,方法不支持 IsOneWay = false 的情况,也就是服务的双向调用。...WCF的service操作默认实现了对Host service的当前线程的SynchonizationContext实现了关联。...代码下载 相关文章: WCF 中的同步环境 WCF后续之旅(11): 关于并发、回调的线程关联性(Thread Affinity)
到目前为止,对于WCF安全传输的三个方面,我们已经对认证进行了详细的介绍,现在我们来关注另外两个话题:消息的一致性和机密性,两者又统称为消息保护(Message Protection)。...消息的安全等级指的是对整个消息或者消息的某个部分事实安全保护采用的等级。按照级别的由低到高,WCF支持如下三种不同的安全等级。...public bool HasProtectionLevel{ get; } 12: } 通过ServiceContractAttribute和OperationContractAttribute特性设置的消息保护级别作用在正常的功能性请求消息和回复消息中...而对于出现异常时返回给客户端的错误消息(Fault Message),我们依然需要加以保护。...为了使我们的程序显得简洁,我写了如下一个针对Binding类型的扩展方法PrintProtectionLevel,用于输出绑定对请求和回复消息采用的保护级别。
实际上,WCF对非FaultException异常的处理并不复杂,我们现在就来简单介绍一下相关的流程:在执行服务操作过程中,如果抛出一个非FaultException异常,WCF会先判断IncludeExceptionDetailInFaults...开发是否开启,如果没有,WCF会手工创建一个MessageFault对象,并根据当前线程的语言文化从资源文件中获取一段固定的文本作为MessageFault的FaultReason(就是我们在《WCF基本的异常处理模式...所以,无论服务端抛出怎样的异常,客户端捕获的总是具有相同信息的FaultException异常。 注:客户端的错误信息总是这么一段文字:“由于内部错误,服务器无法处理该请求。...那么,对于应用了ServiceDebugBehavior服务行为,并开启了IncludeExceptionDetailInFaults的场景,客户端如何能够把承载与Fault消息中的表示错误明细的XML...同样以我们的计算服务为例,在Divide方法中我们直接用ExceptionDetail封装在运算过程中抛出的异常,最终抛出FaultException异常。
服务操作的消息模式 请求/答复模式 --通过请求/答复模式,请求发送发(客户端应用程序)将接收与请求相关的答复,这是默认的模式,因为它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作...--缺点:如果执行操作需要很长的时间,则会降低客户端性能和响应力 --优点:响应消息中可返回SOAP错误,这表名可能在通信或处理中发生了一些与服务有关的错误状况 单向模式 如果WCF服务应用程序的客户端不必等待操作完成.../答复模式与上一节中的实例完全一样的,通常默认的都是请求/答复模式,在此略过。...配置预定义绑定类型 在WCF预定义绑定类型中,WSDualHttpBinding和NetTcpBinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。...然后我们实现在上面服务端建立的客户端回调接口 ?
我们知道,所谓的双工消息交换模式实际上可以看作是多次基于简单模式(数据报和请求/回复模式)的消息交换的组合。...如果忽略服务端对客户端的回调,单独来看双工模式下服务调用采用的消息交换模式,它可以是单向的,也可以是基于请求/回复模式的。...实际上,在这种情况下,不论是针对服务端回调客户端的消息,还是最终调用完成后的回复消息,都是通过路由服务对客户端的回调来实现消息的路由的。...路由服务借用了原本用在信道分发器基于请求消息选择终结点分发器的消息筛选机制来实现根据被路由的消息来选择用于向目标服务路由消息的客户端终结点。...当路由服务接收到请求消息选择目标服务的时候,只需按照先后顺序或者优先级别遍历筛选器表中的每个消息筛选器,并以请求消息作为输入调用之,直到返回结构为True。
对于WCF服务来说,其寄宿在一个资源有限的环境中,为了实现服务性能最大化,需要提高其吞吐量即服务的并发性。然而在不进行流量控制的情况下,并发量过多,会使整个服务由于资源耗尽而崩溃。...由于WCF的并发出来属于服务自身的行为,因此通过服务行为对其进行控制,ServiceBehaviorAttribute(之后回调的CallbackBehaviorAttribute与此类似)中的ConcurrencyModel...属性定义了Single、Reentrant和Multiple三种典型的并发模式,Single表示一个实例上下文InstanceContext只能用于单一请求的处理,Reentrant也表示一个实力上下文某一时刻只能用于对单一请求的处理...,但若涉及回调,也可以用于其他服务调用请求的处理,Multiple表示一个实力上下文可以同时处理多个服务请求。...说到这,不得不提TCP协议,其就是用在解决IP层消息传输不可能和无连接问题的,其通过3此握手建立长连接,通过消息确认和超时重传机制来保证消息的可靠性。那么它与现在要提及的WCF中RM有什么区别呢?
一、两种典型的双工MEP 1.请求过程中的回调 这是一种比较典型的双工消息交换模式的表现形式,客户端在进行服务调用的时候,附加上一个回调对象;服务在对处理该处理中,通过客户端附加的回调对象(实际上是调用回调服务的代理对象...整个消息交换的过程实际上由两个基本的消息交换构成,其一是客户端正常的服务请求,其二则是服务端对客户端的回调。两者可以采用请求-回复模式,也可以采用单向(One-way)的MEP进行消息交换。...图1描述了这样的过程,服务调用和回调都采用请求-回复MEP。 ? 图1 请求过程中的回调 2.订阅-发布 订阅-发布模式是双工模式的一个典型的变体。...客户端调用CalculatorService正常的服务调用,那么在服务执行过程中借助于客户端在服务调用时提供的回调对象对客户端的操作进行回调,从本质上讲是另外一种形式的服务调用。...WSDualHttpBinding通过创建两个单项信道的方式提供双工通信的实现。 对于一个双工通信的WCF服务来说,回调过程本质上也是一种服务调用,是对寄宿于客户端的回调服务的调用。
WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理:在服务操作执行过程中抛出异常(FaultException),在调用服务时捕获异常,完全感觉不到“分布式”的存在...为了实现这样的效果,WCF在内部为我们作了很多。 消息交换是WCF进行通信的唯一手段,消息不仅仅是正常服务调用请求和回复的载体,服务端抛出的异常,甚至是服务的元数据都是通过消息的形式传向客户端的。...右图体现了错误(Fault)在整个WCF异常处理过程中的流转。...在DispatchRuntime的初始化过程中,WCF会根据服务的描述创建一系列的DispatchOperation对象。...在客户端运行时初始化过程中,WCF为每一个操作创建ClientOperation对象(《WCF技术剖析(卷1)》第8章对整个WCF客户端执行流程有详细的介绍)。
我们可以看看网友写的这篇文章《不引用服务而使用WCF,手动编写客户端代理类 》,看看直接使用WCF是如何手动编写客户端代理类的。...我对作者文中有一句话很认同: --我们应当把WCF理解为一种通信技术,而不只是服务。 这正是MSF的设计理念! 回到MSF,我们来看看实现请求-响应通信模式的步骤。 ...三、注册MSF服务类 运行上面编写的服务端和客户端,调用并不成功,在服务端出现了下面的异常: ? 上面截图中显示的错误信息是 :“从注册的所有容器中没有找到符合当前类型的提供程序。”...这个错误信息会返回到客户端: 处理服务时错误:从注册的所有容器中没有找到符 合当前类型的提供程序。...这个错误提示我们没有注册我们的MSF服务类,因为MSF会通过IOC容器去寻找我们调用的服务类,所以需要注册下。
WCF整个服务端运行时架构体系的核心,同时也是对WCF服务端服务模型进行扩展重点考虑的对象。...如果你阅读了《深入剖析授权在WCF中的实现[共14篇]》,相对对这四个对象不会感到陌生。 2、服务实例上下文 服务端框架对服务调用请求的处理最终必然体现在服务实例的创建和操作方法的调用。...如果该信道出现错误(状态变成Faulted),方法ChannelFaulted会被调用。...5、消息检验 WCF允许你对服务端框架进行扩展以实现对路由道终结点分发器的消息进行后续的处理,我们把这个机制成为消息检验。...反之,还有需要分析服务契约中应用在操作上的TransactionFlowAttribute设置。相关的逻辑,请参阅本书第3章《事务》。
我们想对WCF具有一定了解的人都会知道:在客户端通过服务调用进行服务调用过程中,服务代理应该及时关闭。但是如果服务的代理不等得到及时的关闭,到底具有怎样的后果?什么要关闭服务代理?...; 数据报信道(Datagram Channel):即使在同一个数据报信道中,每次消息的交换都是相互独立,信道的错误也不会影响后续的消息交换。...对于WCF客户端来说,如果进行基于会话信道的服务调用,有一些问题需要引起足够的重视,如果使用不当,不但影响客户端本身的服务调用,还会对服务处理请求的吞吐量造成很大的影响。...这种情况的出现源于WCF对并发会话数量的控制。说得具体点,WCF对一个ServiceHost所能处理的并发会话作了限制,在默认的情况下,允许的最大并发会话数量为10。...对服务的并发会话的限制给WCF客户端提出了一个要求,那就是在服务代理不再使用的情况下,应该及时将其关闭。
这边博客介绍如何利用我们现有知识针对OneWay的情形回馈异常 回馈单向模式异常 为什么单向模式不能回馈异常 我们在2019-1-25-wcf入门(4) - huangtengxiao博客中说过,单向模式在调用服务端方法时会立刻返回...那么当我们抛出异常时,服务端已经不知道该把异常信息回复给谁了。 所以对于单向模式,错误协定无法回馈错误信息。 如何回馈单向模式异常 还记得我们解决单向模式返回值问题的方案么?...没错就是2019-1-25-wcf入门(5) - huangtengxiao中提到的双工模式 说白了,就是添加一个传递异常信息的回调接口,在发生异常时向这个回调接口发送异常信息 ?...我们在IFaultCallback接口中添加了一个OnError方法,传递2019-1-29-wcf入门(9) - huangtengxiao中错误协定定义的ServiceFault类型,它包含了方法和异常信息...,其特点有 利用双工在业务层实现 有双工模式的限制 能处理单向操作 参考链接: 如何:在服务协定中声明错误 - Microsoft Docs 定义和指定错误 - Microsoft Docs 在协定和服务中指定和处理错误
本文测试Mono 3.0.2/.NET 4对双工(Duplex)模式的WCF支持。...客户端调用CalculatorService正常的服务调用,那么在服务执行过程中借助于客户端在服务调用时提供的回调对象对客户端的操作进行回调,从本质上讲是另外一种形式的服务调用。...WCF采用基于服务契约的调用形式,客户端正常的服务调用需要服务契约,同理服务端回调客户端依然需要通过描述回调操作的服务契约,我们把这种服务契约称为回调契约。...在WCF中,回调对象通过当前OperationContext的GetCallback方法获得(T代表回调契约的类型)。 ?...具体可以参看 WCF置于Mono下遇到的一些问题 在MONO下实现WCF所遇到的问题 步骤四:实现回调契约 在客户端程序为回调契约提供实现,在下面的代码中CalculateCallback实现了回调契约
领取专属 10元无门槛券
手把手带您无忧上云