WCF 协定中常用的操作

请求-应答操作

协定中的操作均为请求-应答类型,客户端以消息形式发出请求,它会阻塞客户端直到收到应答消息,超过一定时间无应答抛出异常。

除了 NetPeerTcpBinding 和 NetMsmqBinding 绑定,所有的绑定均支持请求-应答操作。

单向操作

有一种场景是 fire and forget,发出去后就弃用模式,WCF为了支持这种场景,提出的单向操作模式。

注意,单向操作并不等同于异步调用。

单向调用操作达到服务端时,不会立即分发这些调用,而是可能放入到服务端的队列中,并在某个时间被分发。

配置说明:

[OperationContract(IsOneWay=true)]
void method();

单向操作与可靠性

客户端不关心调用的结果,并不意味着不关心调用是否发生。

单向操作与会话服务

如下配置

[ServiceContract(SessionMode = SessionMode.Required)]
interface IMycontract
{
   [OperationContract(IsOneWay=true)]
   void MyMethod();
}

在一个会话协定中包含一个单向操作,是一个槽糕的设计! 因为拥有一个会话往往意味着服务需要管理代表了客户端的状态,异常发生会破坏这个状态,而客户端却无法察觉。

建议只将单向操作应用到单调服务或单例服务中。

回调操作

回调本质

服务成为客户端,客户端成为服务。

能应用于回调的绑定

NetTcpBinding 和 NetNamedPipeBinding提供了对回调的支持。

http是状态无关的,所以 BasicHttpBinding 和 WSHttpBinding 不能使用回调。

回调操作

回调操作相关内容请参考博客:
http://www.cnblogs.com/zxj159/p/3986137.html

事件

事件操作相关内容请参考博客:
http://www.cnblogs.com/zxj159/p/3993090.html

流操作

在默认情况下,当客户端调用服务时,服务只有在接收到完整的消息后才会被调用,同样,客户端只有在包含了调用结果的返回消息被完整接受时,才会解除对它的阻塞。

对于数据量小的消息,这种交换模式提供了简单的编程模型,因为接收消息的耗时较之处理消息本身而言是微不足道的。然而,一旦需要处理数据量较大的消息,如包含了多媒体内容、大文本或数据块的消息,如果每次都要等到完整接收消息之后才能解除阻塞,则未免不太现实。

为了解决这样的问题,WCF允许接收到(客户端或服务)在通过通道接收消息的同时,启动对消息数据的处理。这种类型的处理过程称为流传输模型。对于具有大量负载的消息而言,流操作改善了系统的吞吐量和响应速度,因为在发送 或接收消息的同时,不管是发送方还是接收方都不会被阻塞。

见下例:

    [ServiceContract]
    interface IMyContract
    {
        [OperationContract]
        System.IO.Stream StreamReply1();
        [OperationContract]
        System.IO.Stream StreamReply2(out System.IO.Stream stream);
        [OperationContract]
        void StreamRequest(System.IO.Stream stream);
        [OperationContract(IsOneWay = true)]
        void OneWayStream(System.IO.Stream stream);
    }

注意,只能将抽象类型Stream类型或特定的可序列化的子类(如MemoryStream)作为操作参数。诸如FileStream这样的子类都不支持序列化,因为使用基类Stream其实是无奈之举。

WCF允许服务将请求消息、应答消息,以及请求与应答消息转换为流。

流操作与绑定

只有TCP、IPC和基本的HTTP绑定支持流操作。在默认的情况下,这些绑定是禁止流操作的。即使使用了Stream对象,绑定仍然会将消息整体放到缓存中。我们需要根据所需的流模式,通过设置TrasferMode属性启用流操作,例如,以下使用BasicHttpBingding时。

流操作与传输

WCF的流操作只不过是一种良好的编程模型。从根本上讲,传输自身并不支持流操作,它默认的最大消息长度为64KB。 这样的数据可能存在问题时,开发者可能希望使用流操作,转换为流的消息往往会非常大。如果默认的限制不够大,开发者可以增加接收端消息的最大长度,以适应大数据量的消息。可以通过MaxReceivedMessageSize属性,以获得期望的最大消息长度。

相关博客

1 [WCF编程]10.操作:单向操作
http://www.cnblogs.com/zxj159/p/3977093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值