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

上接稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service),第1张

概述客户端: DuplexService.xaml <UserControl x:Class="Silverlight20.Communication.DuplexService"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http://schemas.m
客户端:
DuplexService.xaml <UserControl x:Class="Silverlight20.Communication.DuplexService"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel HorizontalAlignment="left" margin="5">
        
                <TextBox x:name="txtStockCode" Text="请输入股票代码" margin="5" />
                <button x:name="btnsubmit" Content="获取股票信息" Click="btnsubmit_Click" margin="5" />
                <button x:name="btnStop" Content="停止获取" Click="btnStop_Click"    margin="5" />
                <TextBlock x:name="lblStockMessage" margin="5" />
        
        </StackPanel>
</UserControl>   DuplexService.xaml.cs

using System;

using System.Collections.Generic;

using System.linq;

using System.Net;

using System.windows;

using System.windows.Controls;

using System.windows.documents;

using System.windows.input;

using System.windows.Media;

using System.windows.Media.Animation;

using System.windows.Shapes;


using System.ServiceModel;

using System.ServiceModel.Channels;

using System.Threading;

using System.IO;


namespace Silverlight20.Communication

{

         public partial class DuplexService : UserControl

        {

                SynchronizationContext _syncContext;


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

                 bool _status = true;


                 public DuplexService()

                {

                        InitializeComponent();

                }


                 private voID btnsubmit_Click( object sender,RoutedEventArgs e)

                {

                        _status = true;


                         // UI 线程

                        _syncContext = SynchronizationContext.Current;


                        PollingDuplexhttpBinding binding = new PollingDuplexhttpBinding()

                        {

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

                                InactivityTimeout = TimeSpan.FromMinutes(1)

                        };


                         // 构造 IDuplexSessionChannel 的信道工厂

                        IChannelFactory<IDuplexSessionChannel> factory =

                                binding.BuildChannelFactory<IDuplexSessionChannel>( new BindingParameterCollection());


                         // 打开信道工厂

                        IAsyncResult factoryOpenResult =

                                factory.Beginopen( new AsyncCallback(OnopenCompleteFactory),factory);


                         if (factoryOpenResult.CompletedSynchronously)

                        {

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

                                CompleteOpenFactory(factoryOpenResult);

                        }

                }


                 private voID btnStop_Click( object sender,RoutedEventArgs e)

                {

                        _status = false;

                }


                 voID OnopenCompleteFactory(IAsyncResult result)

                {

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

                         if (result.CompletedSynchronously)

                                 return;

                         else

                                CompleteOpenFactory(result);

                }


                 voID CompleteOpenFactory(IAsyncResult result)

                {

                        IChannelFactory<IDuplexSessionChannel> factory = result.AsyncState as IChannelFactory<IDuplexSessionChannel>;


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

                        factory.EndOpen(result);


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

                        IDuplexSessionChannel channel =

                                factory.CreateChannel( new EndpointAddress( "http://localhost:3036/DuplexService.svc"));


                        // 打开信道

                        IAsyncResult channelOpenResult =

                                channel.Beginopen(new AsyncCallback(OnopenCompleteChannel),channel);


                        if (channelOpenResult.CompletedSynchronously)

                        {

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

                                CompleteOpenChannel(channelOpenResult);

                        }

                }


                voID OnopenCompleteChannel(IAsyncResult result)

                {

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

                        if (result.CompletedSynchronously)

                                return;

                        else

                                CompleteOpenChannel(result);

                }


                voID CompleteOpenChannel(IAsyncResult result)

                {

                        IDuplexSessionChannel channel = result.AsyncState as IDuplexSessionChannel;


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

                        channel.EndOpen(result);


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

                        Message message = Message.CreateMessage(

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

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

                                txtStockCode.Text);


                        // 向目的地发送消息

                        IAsyncResult resultChannel =

                                channel.BeginSend(message,new AsyncCallback(OnSend),channel);


                        if (resultChannel.CompletedSynchronously)

                        {

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

                                CompleteOnSend(resultChannel);

                        }


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

                        ReceiveLoop(channel);

                }


                voID OnSend(IAsyncResult result)

                {

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

                        if (result.CompletedSynchronously)

                                return;

                        else

                                CompleteOnSend(result);

                }


                voID CompleteOnSend(IAsyncResult result)

                {

                        try

                        {

                                IDuplexSessionChannel channel = (IDuplexSessionChannel)result.AsyncState;


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

                                channel.EndSend(result);

                        }

                        catch (Exception ex)

                        {

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

                        }

                }


                voID ReceiveLoop(IDuplexSessionChannel channel)

                {

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

                        IAsyncResult result =    

                                channel.BeginReceive(new AsyncCallback(OnReceiveComplete),channel);


                        if (result.CompletedSynchronously)

                        {

                                CompleteReceive(result);

                        }

                }


                voID OnReceiveComplete(IAsyncResult result)

                {

                        if (result.CompletedSynchronously)

                                return;

                        else

                                CompleteReceive(result);

                }


                voID CompleteReceive(IAsyncResult result)

                {

                        IDuplexSessionChannel channel = (IDuplexSessionChannel)result.AsyncState;


                        try

                        {

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

                                Message receivedMessage = channel.EndReceive(result);


                                if (receivedMessage == null)

                                {

                                        // 服务端会话已被关闭

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

                                }

                                else

                                {

                                        // 将接收到的信息输出到界面上

                                        string text = receivedMessage.Getbody<string>();

                                        _syncContext.Post(WriteText,text + Environment.Newline);


                                        if (!_status)

                                        {

                                                // 关闭信道

                                                IAsyncResult resultFactory =

                                                        channel.BeginClose(new AsyncCallback(OnCloseChannel),channel);


                                                if (resultFactory.CompletedSynchronously)

                                                {

                                                        CompleteCloseChannel(result);

                                                }


                                        }

                                        else

                                        {

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

                                                ReceiveLoop(channel);

                                        }

                                }

                        }

                        catch (Exception ex)

                        {

                                // 出错则记日志

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

                                {

                                        sw.Write(ex.ToString());

                                        sw.Writeline();

                                }

                        }

                }


                voID OnCloseChannel(IAsyncResult result)

                {

                        if (result.CompletedSynchronously)

                                return;

                        else

                                CompleteCloseChannel(result);

                }


                voID CompleteCloseChannel(IAsyncResult result)

                {

                        IDuplexSessionChannel channel = (IDuplexSessionChannel)result.AsyncState;


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

                        channel.EndClose(result);

                }


                voID WriteText(object text)

                {

                        // 将信息打到界面上

                        lblStockMessage.Text += (string)text;

                }

        }

}     OK
[源码下载]
总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1052378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存