zoukankan      html  css  js  c++  java
  • WCF操作:请求应答(RequestReply)、单向操作(OneWay)、回调操作(Call Back)

    原文参考:http://www.cnblogs.com/frank_xl/archive/2009/05/05/1437494.html

         WCF除了支持经典的请求/应答模式意外,还提供了对单向操作、双向回调操作模式的支持,此外还有流操作.

    【1】请求应答(Request-Reply):

           请求应答模式是默认的操作模式。这与经典的C/S编程类似,客户端发送请求,阻塞客户端进程,服务端返回操作结果。

    【2】单向操作(One-Way):

    【2.1】概念:

        简单来说,单向操作没有返回值,客户端只管调用,不管结果。单向操作客户端一旦发出请求,WCF会生成一个请求,不会给客户端返回任何消息。单向操作不同于异步操作,虽然单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入队列,并在某个时候执行。队列存储调用的个数是有限的,一旦发出的调用个数超出了队列存储调用的设置值,则会发生阻塞现象,因为调用无法放入队列。当队列的请求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞。(和请求应答模式不同。所有的WCF绑定通信协议都支持单向操作。 )

    //操作契约,单调操作,不返回应答消息,会话服务中,保证是最后一个操作
    [OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)]//
    void SayHello2(string name);

    单向操作配置的属性定义在操作契约级别上。而不是用在服务契约级别。

    【2.3】单向操作小节:   

     (1)被设置为单向操作的方法不能包含返回值,即它的返回值只能为void,否则会抛出InvalidOperationException异常。 
     (2)在会话契约中虽然允许定义单向操作([ServiceContract( SessionMode =SessionMode.Required, Namespace = "http://www.cnblogs.com/frank_xl/")]),但由于单向操作服务端管理客户端会话状态十分困难,因而,单向操作的最佳适用场景是在单调服务或单例服务中。如果在会话契约中定义了单向操作,就必须保证单向操作是终止会话的最后一个操作,返回void类型值。这可以通过分步操作来实现。代码如下:

    //1.单向服务契约,会话服务
     //SessionMode是客户端代理与服务器之间的会话模式,同样也有三种类型:Allowed-允许会话、NotAllowed-不允许会话、
    //Required-要求会话(需要有支持会话的Binding支持,WsHttpBinding、NetTcpBinding等)
    [ServiceContract( SessionMode =SessionMode.Required, Namespace = "http://www.cnblogs.com/frank_xl/")]
    public interface IWCFServiceOneWay
    {
    //操作契约,单调操作,不返回应答消息,会话服务中,保证是最后一个操作
    [OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=true)]//
    void SayHello2(string name);
    //操作契约,
    [OperationContract]
    string SayHello1(string name);

    }

    (3)如果因为通信(地址宿主)问题,调用操作失败,单向操作如果抛出异常;客户端受服务端异常影响,取决于实例模式以及使用绑定。

    【3】回调操作(Call Back):

    【3.1】概念:

        回调不是一个新的概念,早在C语言里就有过,C#里更是有委托实现回调机制。软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在WCF软件架构中的实现。

        BasicHttpBinding,WSHttpBinding绑定协议不支持回调操作。NetTcpBinding和NetNamedPipeBinding绑定支持回调操作;具有可靠消息传输的WSDualHttpBinding绑定是通过设置两个HTTP信道来支持双向通信。  

    【3.2】实现代码:
       一个服务契约只能包含一个回调契约。通过ServiceContract特性,可以指定回调契约:

    public interface ICallback
    {
    [OperationContract(IsOneWay
    = true)]
    void DisplayResult(int x);
    }

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract(CallbackContract=typeof(ICallback))]
    public interface IService1
    {
    [OperationContract(IsOneWay
    =true)]
    void GetData(int value);
    }
    }

    回调契约无须标记ServiceContract特性,但是在回调契约中必须为服务的操作标记OperationContract特性。 
    在导入回调契约的元数据中,回调契约以Callback结尾。服务端反序列化本地代码的时候会生成客户端回调操作契约Callback后缀

    在服务端,可以通过OperationContext类的泛型方法GetCallbackChannel<T>()获得。代码如下: 

    public class Service1 : IService1
    {
    public void GetData(int value)
    {
    ICallback callback
    = OperationContext.Current.GetCallbackChannel<ICallback>();
    callback.DisplayResult(value);
    }
    }

    服务端配置文件与之前无异:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>

    <system.web>
    <compilation debug="true" />
    </system.web>
    <!-- 部署服务库项目时,必须将配置文件的内容添加到
    主机的 app.config 文件中。System.Configuration 不支持库的配置文件。
    -->
    <system.serviceModel>
    <services>
    <service name="Tivon.Library.Service1">
    <host>
    <baseAddresses>
    <add baseAddress = "net.tcp://localhost:8732/Design_Time_Addresses/Tivon.Library/Service1/" />
    </baseAddresses>
    </host>
    <endpoint address ="" binding="netTcpBinding" contract="Tivon.Library.IService1"/>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
    </service>
    </services>
    <behaviors>
    <serviceBehaviors>
    <behavior>
    <serviceMetadata httpGetEnabled="False"/>
    <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>

    </configuration>
  • 相关阅读:
    HDU2034 人见人爱 A
    二分查找
    利用向量积(叉积)计算三角形(多边形)的面积
    找出能被5或6整除,但是不能被两者同时整除的数 Exercise05_11
    找出分数最高的前两个学生 Exercise05_09
    金融应用,计算将来的学费 Exercise05_07
    千克与磅之间的转换 Exercise05_05
    将千克转换成磅 Exercise05_03
    统计正数和负数的个数,然后计算这些数的平均值 Exercise05_01
    回文数
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2072067.html
Copyright © 2011-2022 走看看