silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

[索引页] [源码下载] 稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex servicE) 作者: webabcd 介绍 Silverlight 2.0 调用 WCF 的双向通信服务(Duplex servicE) 。开发一个服务端主动向客服端发送股票信息的程序,首先客户端先向服务端发送需要监控的股票的股票代码,然后服务端在该股信息发生变化的时候将信息推
[索引页]
[源码下载]


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex servicE)


作者: webabcd


介绍
Silverlight 2.0 调用 WCF 的双向通信服务(Duplex servicE) 。开发一个服务端主动向客服端发送股票信息的程序,首先客户端先向服务端发送需要监控的股票的股票代码,然后服务端在该股信息发生变化的时候将信息推送到客户端。
    服务端:
        定义服务契约及回调接口
        从当前上下文获取回调的客户端信道
        需要的话则向客户端信道“推”消息
    客户端:
        构造 PollingDuplexhttpBinding 并在其上创建 IDuplexSessionChAnnel 的信道工厂
        异步方式打开信道工厂
        异步方式打开信道
        构造需要发送到服务端的消息 System.serviceModel.ChAnnels.message
        异步向服务端发送消息
        监听指定信道,用于异步方式接收服务端返回的消息
        不需要再接收服务端的消息则关闭信道


在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html


示例
服务端:
IDuplexservice.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Runtime.serialization;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Text;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// IDuplexservice - 双工(Duplex)服务契约

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// CallBACkContract - 双工(Duplex)服务的回调类型

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

[serviceContract(Namespace  =   " Silverlight20 " , CallBACkContract  =   typeof (IDuplexClient))]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   interface  IDuplexservice

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// 客户端向服务端发送消息的方法

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <param NAME="receivedmessage">客户端向服务端发送的消息 System.serviceModel.ChAnnels.message</param>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    [OperationContract(IsOneWay = true)]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
void SendStockCode(message receivedmessagE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


@H_607_363@

@H_675_368@

/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// 双工(Duplex)服务的回调接口

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   interface  IDuplexClient

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// 客户端接收服务端发送过来的消息的方法

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <param NAME="returnmessage">服务端向客户端发送的消息 System.serviceModel.ChAnnels.message</param>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    [OperationContract(IsOneWay = true)]

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
void receiveStockmessage(message returnmessagE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


Duplexservice.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Runtime.serialization;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Text;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Threading;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.Activation;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.IO;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// Duplex 服务的服务端的实现

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// 本文以客户端向服务端提交股票代码,服务端定时向客户端发送股票信息为例

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   class  Duplexservice : IDuplexservice

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    IDuplexClient _client;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
bool _status = true;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// 客户端向服务端发送股票代码方法

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// </sumMary>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
/// <param NAME="receivedmessage">包含股票代码的 System.serviceModel.ChAnnels.message </param>

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    public void SendStockCode(message receivedmessagE)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 获取当前上下文的回调信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        _client = OperationContext.Current.GetCallBACkChAnnel<IDuplexClient>();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 如果发生错误则不再执行

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        OperationContext.Current.ChAnnel.Faulted += new EventHandler(delegate { _status = false; });

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 获取用户提交的股票代码

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        String stockCode = receivedmessage.GetBody<String>();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 每3秒向客户端发送一次股票信息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        while (_status)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 构造需要发送到客户端的 System.serviceModel.ChAnnels.message

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// Duplex 服务仅支持 Soap11 , Action 为请求的目的地(需要执行的某行为的路径)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            message stockmessage = message.Createmessage(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                messageVersion.soap11,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
"Silverlight20/IDuplexservice/ReceiveStockmessage",

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
String.Format("StockCode: {0}; StockPrice: {1}; CurrentTime: {2}",

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    stockCode,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
new random().Next(1200),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    datetiR_461_11845@e.Now.ToString()));

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
try

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 向客户端“推”数据

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                _client.ReceiveStockmessage(stockmessagE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
catch (Exception eX)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 出错则记日志

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                using (StreamWriter sw = new StreamWriter(@"C:/Silverlight_Duplex_Log.txt"true))

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    sw.Write(ex.ToString());

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    sw.WriteLine();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            System.Threading.Thread.Sleep(
3000);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

PollingDuplexserviceHostFactory.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Web;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.Activation;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

/* 以下部分摘自文档 */

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

//  服务 svc 文件的 Factory 要指定为此类

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

public   class  PollingDuplexserviceHostFactory : serviceHostFactoryBase

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
public override serviceHostBase CreateserviceHost(String constructorString,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        UrI[] baseAddresses)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
return new PollingDuplexSimplexserviceHost(baseAddresses);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

class  PollingDuplexSimplexserviceHost : serviceHost

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

@H_720_1675@

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
public PollingDuplexSimplexserviceHost(params System.UrI[] addresses)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
base.InitializeDescription(typeof(DuplexservicE)new UrischeR_461_11845@eKeyedCollection(addresses));

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
protected override void InitializeRuntime()

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 配置 WCF 服务与 Silverlight 客户端之间的 Duplex 通信

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// Silverlight 客户端定期轮询网络层上的服务,并检查回调信道上由服务端发送的所有新的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 该服务会将回调信道上的由服务端发送的所有消息进行排队,并在客户端轮询服务时将这些消息传递到该客户端

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        PollingDuplexBindingElement pdbe 
= new PollingDuplexBindingElement()

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// ServerPollTimeout - 轮询超时时间

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// InactivityTimeout - 服务端与客户端在此超时时间内无任何消息交换的情况下,服务会关闭其会话

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            ServerPollTimeout 
= TimeSpan.FromSeconds(3),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            inactivityTimeout 
= TimeSpan.Fromminutes(1)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }
;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 为服务契约(service contract)添加一个终结点(endpoint)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// Duplex 服务仅支持 Soap11

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        this.AddserviceEndpoint(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
typeof(IDuplexservicE),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
new CustomBinding(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                pdbe,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
new textmessageEncodingBindingElement(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    messageVersion.soap11,

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    System.Text.Encoding.UTF8),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
new httpTransportBindingElement()),

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
"");

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
base.InitializeRuntime();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


Duplexservice.svc

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

<% serviceHost Language="C#" Debug="true" service="Duplexservice" CodeBehind="~/App_Code/Duplexservice.cs" Factory="PollingDuplexserviceHostFactory"  %>


客户端:
Duplexservice.xaml

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

< UserControl  x:Class ="Silverlight20.Communication.Duplexservice"

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    xmlns
="http://scheR_461_11845@as.microsoft.com/winfx/2006/xaml/presentation"  

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    xmlns:x
="http://scheR_461_11845@as.microsoft.com/winfx/2006/xaml" >

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
< StackPanel  HorizontalAlignment ="Left"  Margin ="5" >

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
< TextBox  x:Name ="txtStockCode"  text ="请输入股票代码"  Margin ="5"   />

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
< Button  x:Name ="btnSubmit"  Content ="获取股票信息"  Click ="btnSubmit_Click"  Margin ="5"   />

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
< Button  x:Name ="btnStop"  Content ="停止获取"  Click ="btnStop_Click"   Margin ="5"   />

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
< TextBlock  x:Name ="lblStockmessage"  Margin ="5"   />

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
</ StackPanel >

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

</ UserControl >

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


Duplexservice.xaml.cs

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Collections.Generic;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Linq;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Net;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows.Controls;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows.Documents;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows.Input;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows.Media;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows.Media.Animation;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Windows.Shapes;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.serviceModel.ChAnnels;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.Threading;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

using  System.IO;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

namespace  Silverlight20.Communication

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

@H_489_2593@

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    
public partial class Duplexservice : UserControl

@H_227_2623@

@H_304_2628@

    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        SynchronizationContext _syncContext;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
// 是否接收服务端发送过来的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        bool _status = true;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
public Duplexservice()

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            initializeComponent();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
private void btnSubmit_Click(object sender, routedEventArgs E)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            _status 
= true;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// UI 线程

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            _syncContex= SynchronizationContext.Current;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            PollingDuplexhttpBinding binding 
= new PollingDuplexhttpBinding()

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// InactivityTimeout - 服务端与客户端在此超时时间内无任何消息交换的情况下,服务会关闭其会话

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                InactivityTimeout = TimeSpan.Fromminutes(1)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }
;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 构造 IDuplexSessionChAnnel 的信道工厂

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IChAnnelFactory<IDuplexSessionChAnnel> factory =

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                binding.buildChAnnelFactory
<IDuplexSessionChAnnel>(new BindingParameterCollection());

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 打开信道工厂

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IAsyncResult factoryOpenResult =

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                factory.beginOpen(
new AsyncCallBACk(OnOpenCompleteFactory), factory);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
if (factoryOpenResult.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 如果信道工厂被打开的这个 异步操作 已经被 同步完成 则执行下一步

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteOpenFactory(factoryOpenResult);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
private void btnStop_Click(object sender, routedEventArgs E)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
@H_404_2522@{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            _status 
= false;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void OnOpenCompleteFactory(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 该异步操作已被同步完成的话则不做任何操作,反之则执行下一步

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            if (result.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
return;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteOpenFactory(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void CompleteOpenFactory(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

@H_443_3262@

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IChAnnelFactory
<IDuplexSessionChAnnel> factory = result.AsyncState as IChAnnelFactory<IDuplexSessionChAnnel>;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 完成异步操作,以打开信道工厂

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            factory.Endopen(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 在信道工厂上根据指定的地址创建信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IDuplexSessionChAnnel chAnnel =

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                factory.CreateChAnnel(
new EndpointAddress("http://localhost:3036/Duplexservice.svc"));

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 打开信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IAsyncResult chAnnelOpenResult =

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                chAnnel.beginOpen(
new AsyncCallBACk(OnOpenCompleteChAnnel), chAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
if (chAnnelOpenResult.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 如果信道被打开的这个 异步操作 已经被 同步完成 则执行下一步

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteOpenChAnnel(chAnnelOpenResult);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void OnOpenCompleteChAnnel(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 该异步操作已被同步完成的话则不做任何操作,反之则执行下一步

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            if (result.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
return;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteOpenChAnnel(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void CompleteOpenChAnnel(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
@H_366_3618@

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IDuplexSessionChAnnel chAnnel 
= result.AsyncState as IDuplexSessionChAnnel;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 完成异步操作,以打开信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            chAnnel.Endopen(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 构造需要发送到服务端的 System.serviceModel.ChAnnels.message (客户端终结点与服务端终结点之间的通信单元)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            message message = message.Createmessage(

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                chAnnel.GetProperty
<messageVersion>(), // messageVersion.soap11 (Duplex 服务仅支持 Soap11)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                "Silverlight20/IDuplexservice/SendStockCode"// Action 为请求的目的地(需要执行的某行为的路径)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                txtStockCode.Text);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 向目的地发送消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IAsyncResult resultChAnnel =

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                chAnnel.beginSend(message, 
new AsyncCallBACk(OnSend), chAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
if (resultChAnnel.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 如果向目的地发送消息的这个 异步操作 已经被 同步完成 则执行下一步

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteOnSend(resultChAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 监听指定的信道,用于接收返回的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            receiveLoop(chAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void OnSend(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 该异步操作已被同步完成的话则不做任何操作,反之则执行下一步

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            if (result.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
return;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteOnSend(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void CompleteOnSend(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
@H_502_3230@{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
try

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

@H_489_4038@

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                IDuplexSessionChAnnel chAnnel 
= (IDuplexSessionChAnnel)result.AsyncState;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 完成异步操作,以完成向目的地发送消息的操作

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                chAnnel.EndSend(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
catch (Exception eX)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                _syncContext.Post(WriteText, ex.ToString() 
+ Environment.NewLinE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void receiveLoop(IDuplexSessionChAnnel chAnnel)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 监听指定的信道,用于接收返回的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IAsyncResult result = 

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                chAnnel.beginReceive(
new AsyncCallBACk(OnReceiveCompletE), chAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
if (result.CompletedSynchronously)

@H_941_3404@

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteReceive(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void OnReceiveComplete(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
if (result.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
return;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteReceive(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void CompleteReceive(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IDuplexSessionChAnnel chAnnel 
= (IDuplexSessionChAnnel)result.AsyncState;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
try

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

@H_404_3549@

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 完成异步操作,以接收到服务端发过来的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                message receivedmessage = chAnnel.EndReceive(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
if (receivedmessage == null)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

@H_549_4503@

                
@H_489_4507@

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
// 服务端会话已被关闭

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
// 此时应该关闭客户端会话,或向服务端发送消息以启动一个新的会话

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
// 将接收到的信息@L_874_106@到界面上

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    String tex= receivedmessage.GetBody<String>();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    _syncContext.Post(WriteText, tex
+ Environment.NewLinE);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
if (!_status)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        
// 关闭信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        IAsyncResult resultFactory =

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                            chAnnel.beginClose(
new AsyncCallBACk(OnCloseChAnnel), chAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        
if (resultFactory.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                            CompleteCloseChAnnel(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        
// 继续监听指定的信道,用于接收返回的消息

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                        receiveLoop(chAnnel);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
catch (Exception eX)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
// 出错则记日志

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                using (StreamWriter sw = new StreamWriter(@"C:/Silverlight_Duplex_Log.txt"true))

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    sw.Write(ex.ToString());

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                    sw.WriteLine();

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void OnCloseChAnnel(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
if (result.CompletedSynchronously)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                
return;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
else

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

                CompleteCloseChAnnel(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void CompleteCloseChAnnel(IAsyncResult result)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            IDuplexSessionChAnnel chAnnel 
= (IDuplexSessionChAnnel)result.AsyncState;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 完成异步操作,以关闭信道

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            chAnnel.EndClose(result);

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)


稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
void WriteText(object text)

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        
{

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            
// 将信息打到界面上

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

            lblStockmessage.Text += (String)text;

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

        }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

    }

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

}


OK
[源码下载]

大佬总结

以上是大佬教程为你收集整理的稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)全部内容,希望文章能够帮你解决稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。