• WCF 第三章 信道 ICommunicationObject


    ICommunicationObject 接口(查看列表3.8)是WCF中所有通信对象(信道,信道工厂,信道监听器,等等)的基础。打算创建自定义信道或者直接使用信道的开发人员需要了解这个 接口。WCF中的通信对象需要实现一个特殊的状态机。状态机表示了所有通信对象的状态变化。这种情况就像其他通信对象(比如,套接字)所处理的那样。 ICommunicationObject接口(还有与它相关联的方法,状态和事件)的目的是为了实现状态机。这允许WCF能够将按同样的方式处理通信对 象,并让他们下层实现与抽象层分离。

    列表3.8 ICommunicationObject 接口

    using System;

    namespace System.ServiceModel
    {
    public interface ICommunicationObject
    {
    CommunicationState State {
    get; }

    event EventHandler Closed;
    event EventHandler Closing;
    event EventHandler Faulted;
    event EventHandler Opened;
    event EventHandler Opening;

    void Abort();
    IAsyncResult BeginClose(AsyncCallback callback,
    object state);
    IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback,
    object state);
    IAsyncResult BeginOpen(AsyncCallback callback,
    object state);
    IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback,
    object state);
    void Close();
    void Close(TimeSpan timeout);
    void EndClose(IAsyncResult result);
    void EndOpen(IAsyncResult result);
    void Open();
    void Open(TimeSpan timeout);
    }
    }

    列表3.9 显示了由CommunicationState枚举提供的状态

    using System;

    namespace System.ServiceModel
    {
    public enum CommunicationState
    {
    Created
    = 0,
    Opening
    = 1,
    Opened
    = 2,
    Closing
    = 3,
    Closed
    = 4,
    Faulted
    = 5,
    }
    }
     

    CommunicationState枚举列举了通信对象改变的6个状态。所有通信对象的初始状态是Created.这是通信对象被初始化时的状 态。所有通信对象的最后状态时Closed.在这个方式中,在ICommunicationObject接口上调用的方法将通信对象从一个状态转移到另一 个状态。比如,Open() 方法被调用来传输一个通信对象并使其的状态从Created变成Opened.图片3.5显示了一个显示了通信对象的状态和通信对象状态切换的示意图。

    通信对象的一个例子是ClientBase<>类,是通过Visual Studio 的添加服务引用或者svcutil.exe生成的客户端的基础实现。

    注意 不能重用客户端

    当一个通信对象已经由Opened状态变成Closing或者Faulted状态后就无法再变回去。这意味着通信状态不能回到Opened状态除非首先重建通信对象。因此,当客户端被关闭(当他们的状态时Closed时)以后它们需要被重新创建。

    ICommunicationObject接口支持五个事件(Opening, Opened, Closing, Closed和Faulted).这些事件用来通知代码状态改变。

    提示 客户端通知

    应用程序维护一个到客户端代理的引用是很平常的。当客户端代理进入Faulted 状态(最后是Closed状态)时,使用状态转换事件来提醒是很重要的,因为这样客户端和服务端的通信才能保持。

    使用ICommunicationObject接口时,通常通过把一个已有的通信对象强制转换成接口来获取对 ICommunicationObject暴露的事件和方法的访问能力。然后,还有些情况你需要创建一个新的通信对象来扩展WCF的能力。这种情况 下,WCF提供了一个称为CommunicationObject的抽象的基类,它提供了ICommunicationObject接口和相关状态机的实 现。列表3.10显示了一个由svcutil.exe生成的StockQuoteServiceClient类。这个客户的继承自 ClientBase<>类。代码显示了客户端被强转成一个ICommunicationObject接口以便于我们可以接受通信对象。

    列表3.10 ICommunicationObject 例子

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Channels;

    namespace EssentialWCF
    {
    class Program
    {
    static void Main(string[] args)
    {
    string symbol = "MSFT";
    double value;
    StockQuoteServiceClient client
    = new StockQuoteServiceClient();
    ICommunicationObject commObj
    = (ICommunicationObject)client;
    commObj.Closed
    += new EventHandler(Closed);
    commObj.Faulted
    += new EventHandler(Faulted);
    value
    = client.GetQuote(symbol);
    Console.WriteLine(
    "{0}@{1}", symbol, value);
    Console.ReadLine();
    }
    static void Closed(object sender, EventArgs e)
    {
    //Handle Closed Event
    }
    static void Faulted(object sender, EventArgs e)
    {
    //Handle Faulted Event
    }
    }
    }

    ========

    转载自

     

  • 相关阅读:
    2018年3月至4月小结
    前端面试中,经常看到垂直居中与水平居中,实际排版用的多吗?
    Hbuilder配置识别逍遥安卓模拟器
    php静态变量与方法与phar的使用
    切面反射获取方法
    Spring:源码解读Spring IOC原理
    怎样批量提取JPG照片的文件名
    如何1秒批量提取电脑文件夹中的所有文件、文件夹名字到txt/excel
    用powermock 方法中new对象
    springboot单元测试自动回滚:@Transactional
  • 原文地址:https://www.cnblogs.com/llbofchina/p/2092978.html
Copyright © 2020-2023  润新知