天天看点

稳扎稳打Silverlight(39) - 3.0通信之二进制XML通信, 本地连接

<a href="http://webabcd.blog.51cto.com/1787395/342743" target="_blank">[索引页]</a>

<a href="http://down.51cto.com/data/100302" target="_blank">[源码下载]</a>

稳扎稳打Silverlight(39) - 3.0通信之二进制XML通信, 本地连接

介绍

Silverlight 3.0 通信的新增功能

二进制XML通信 - 与 WCF 服务间通信,可以使用二进制 XML 传递数据(提高传输性能) 

本地连接 - 允许客户端的两个 Silverlight 程序之间直接进行通信(不用通过服务端)

在线DEMO

示例

1、以二进制 XML 传递数据的演示

服务端(WCF)

BinaryXmlService.svc

using System; 

using System.Linq; 

using System.Runtime.Serialization; 

using System.ServiceModel; 

using System.ServiceModel.Activation; 

using System.Collections.Generic; 

using System.Text; 

namespace Silverlight30.Service 

        /// &lt;summary&gt; 

        /// 一个简单的 WCF 服务 

        /// &lt;/summary&gt; 

        [ServiceContract] 

        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

        public class BinaryXmlService 

        { 

                [OperationContract] 

                public string Hello(string name) 

                { 

                        return "Hello: " + name; 

                } 

        } 

}

Web.config

&lt;system.serviceModel&gt; 

        &lt;bindings&gt; 

                &lt;customBinding&gt; 

                        &lt;binding name="customBinding0"&gt; 

                                &lt;binaryMessageEncoding /&gt; 

                                &lt;httpTransport /&gt; 

                        &lt;/binding&gt; 

                &lt;/customBinding&gt; 

        &lt;/bindings&gt; 

        &lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true" /&gt; 

        &lt;behaviors&gt; 

                &lt;serviceBehaviors&gt; 

                        &lt;behavior name="Silverlight30.Service.BinaryXmlServiceBehavior"&gt; 

                                &lt;serviceMetadata httpGetEnabled="true" /&gt; 

                                &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; 

                        &lt;/behavior&gt; 

                &lt;/serviceBehaviors&gt; 

        &lt;/behaviors&gt; 

        &lt;services&gt; 

                &lt;service behaviorConfiguration="Silverlight30.Service.BinaryXmlServiceBehavior" 

                        name="Silverlight30.Service.BinaryXmlService"&gt; 

                        &lt;endpoint address="" binding="customBinding" bindingConfiguration="customBinding0" 

                                contract="Silverlight30.Service.BinaryXmlService" /&gt; 

                        &lt;endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /&gt; 

                &lt;/service&gt; 

        &lt;/services&gt; 

&lt;/system.serviceModel&gt;

客户端

BinaryXml.xaml

&lt;navigation:Page x:Class="Silverlight30.Communication.BinaryXml"    

                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    

                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

                     mc:Ignorable="d" 

                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 

                     d:DesignWidth="640" d:DesignHeight="480" 

                     Title="BinaryXml Page"&gt; 

        &lt;Grid x:Name="LayoutRoot"&gt; 

                &lt;StackPanel Orientation="Horizontal" Height="30"&gt; 

                        &lt;!--支持二进制 XML 通信--&gt; 

                        &lt;TextBox x:Name="txtName" Text="webabcd" /&gt; 

                        &lt;Button x:Name="btnHelloConfig" Content="引用服务后(使用代理),通过配置的方式与服务端做二进制XML通信" Click="btnHelloConfig_Click" /&gt; 

                        &lt;Button x:Name="btnHelloCoding" Content="引用服务后(使用代理),通过编程的方式与服务端做二进制XML通信" Click="btnHelloCoding_Click" /&gt; 

                &lt;/StackPanel&gt; 

        &lt;/Grid&gt; 

&lt;/navigation:Page&gt;

BinaryXml.xaml.cs

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.Windows.Navigation; 

using Silverlight30.BinaryXmlService; 

using System.ServiceModel.Channels; 

namespace Silverlight30.Communication 

        public partial class BinaryXml : Page 

                public BinaryXml() 

                        InitializeComponent(); 

                void client_HelloCompleted(object sender, HelloCompletedEventArgs e) 

                        if (e.Error == null) 

                                MessageBox.Show(e.Result); 

                        else 

                                MessageBox.Show(e.Error.ToString()); 

                private void btnHelloConfig_Click(object sender, RoutedEventArgs e) 

                        // 通过配置文件(ServiceReferences.ClientConfig)的方式调用以二进制 XML 通信的 WCF 服务(需要使用代理) 

                        BinaryXmlServiceClient client = new BinaryXmlServiceClient(); 

                        client.HelloCompleted += new EventHandler&lt;HelloCompletedEventArgs&gt;(client_HelloCompleted); 

                        client.HelloAsync(txtName.Text); 

                private void btnHelloCoding_Click(object sender, RoutedEventArgs e) 

                        // 通过编程的方式调用以二进制 XML 通信的 WCF 服务(需要使用代理) 

                        BinaryMessageEncodingBindingElement binary = new BinaryMessageEncodingBindingElement(); 

                        HttpTransportBindingElement transport = new HttpTransportBindingElement(); 

                        CustomBinding binding = new CustomBinding(binary, transport); 

                        EndpointAddress address = new EndpointAddress("http://localhost:8616/BinaryXmlService.svc"); 

                        BinaryXmlServiceClient client = new BinaryXmlServiceClient(binding, address); 

ServiceReferences.ClientConfig

&lt;configuration&gt; 

        &lt;system.serviceModel&gt; 

                &lt;bindings&gt; 

                        &lt;customBinding&gt; 

                                &lt;binding name="CustomBinding_BinaryXmlService"&gt; 

                                        &lt;binaryMessageEncoding /&gt; 

                                        &lt;httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /&gt; 

                                &lt;/binding&gt; 

                        &lt;/customBinding&gt; 

                &lt;/bindings&gt; 

                &lt;client&gt; 

                        &lt;endpoint address="http://localhost:8616/BinaryXmlService.svc" 

                                binding="customBinding" bindingConfiguration="CustomBinding_BinaryXmlService" 

                                contract="BinaryXmlService.BinaryXmlService" name="CustomBinding_BinaryXmlService" /&gt; 

                &lt;/client&gt; 

        &lt;/system.serviceModel&gt; 

&lt;/configuration&gt;

2、本地连接的演示

Silverlight 程序 1

LocalConnection.xaml

&lt;navigation:Page x:Class="Silverlight30.Communication.LocalConnection"    

                     Title="LocalConnection Page"&gt; 

                &lt;StackPanel&gt; 

                        &lt;!--结合 Silverlight30.LocalConnection/MainPage.xaml 中的项目演示 Silverlight 对本地连接的支持--&gt; 

                        &lt;TextBlock Text="我是 abc" /&gt; 

                        &lt;Button x:Name="btnSubmit" Content="提交" Click="btnSubmit_Click" /&gt; 

                        &lt;TextBlock x:Name="lblResult" /&gt; 

LocalConnection.xaml.cs

/* 

 * LocalMessageReceiver - 本地连接接收器 

 *         ReceiverName - 接收器的名称。与另一个 Silverlight 程序所设置的发送器的接收器名称相对应 

 *         AllowedSenderDomains - 信任的发送器所属域名列表 

 *         DisableSenderTrustCheck - 是否不理会 Vista 下的 IE 7 的保护模式。默认值为 false 

 *         NameScope - 接收器名称是在同域唯一还是在全域唯一(ReceiverNameScope.Domain 同域唯一,默认值;ReceiverNameScope.Global 全域唯一) 

 *         Listen() - 开始监听发送过来的信息 

 *         MessageReceived事件 - 接收完成事件 

 *            

 * LocalMessageSender - 本地连接发送器 

 *         ReceiverName - 接收器的名称。与另一个 Silverlight 程序所设置的接收器的接收器名称相对应 

 *         ReceiverDomain - 将要发送至的接收器所属域名 

 *         SendAsync(string message, object userState) - 异步发送数据。(参数1:需要发送的信息;参数2:上下文,可以传递给发送完成事件) 

 *         SendCompleted事件 - 发送完成事件 

 */ 

using System.Windows.Messaging; 

        public partial class LocalConnection : Page 

                LocalMessageSender _sender; 

                public LocalConnection() 

                        this.Loaded += new RoutedEventHandler(LocalConnection_Loaded); 

                void LocalConnection_Loaded(object sender, RoutedEventArgs e) 

                        _sender = new LocalMessageSender("abc"); 

                        LocalMessageReceiver receiver = new LocalMessageReceiver("xyz"); 

                        receiver.MessageReceived += new EventHandler&lt;MessageReceivedEventArgs&gt;(receiver_MessageReceived); 

                        receiver.Listen();                         

                void receiver_MessageReceived(object sender, MessageReceivedEventArgs e) 

                        lblResult.Text += e.Message + "\r\n"; 

                private void btnSubmit_Click(object sender, RoutedEventArgs e) 

                        _sender.SendAsync("在 abc 单击了按钮"); 

Silverlight 程序 2

Silverlight30.LocalConnection/MainPage.xaml

&lt;UserControl x:Class="Silverlight30.LocalConnection.MainPage" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    

        mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"&gt; 

                        &lt;!--结合 Silverlight30/Communication/LocalConnection.xaml 中的项目演示 Silverlight 对本地连接的支持--&gt; 

                        &lt;TextBlock Text="我是 xyz" /&gt; 

&lt;/UserControl&gt;

Silverlight30.LocalConnection/MainPage.xaml.cs

namespace Silverlight30.LocalConnection 

        public partial class MainPage : UserControl 

                public MainPage() 

                        this.Loaded += new RoutedEventHandler(MainPage_Loaded); 

                void MainPage_Loaded(object sender, RoutedEventArgs e) 

                        _sender = new LocalMessageSender("xyz"); 

                        LocalMessageReceiver receiver = new LocalMessageReceiver("abc"); 

                        receiver.Listen(); 

                        lblResult.Text += e.Message + Environment.NewLine; 

                        _sender.SendAsync("在 xyz 单击了按钮"); 

以上两个 Silverlight 程序间可以进行本地通信

Silverlight30.LocalConnectionTestPage.html

&lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" 

        height="100%" style="float: left; width: 50%"&gt; 

        &lt;param name="source" value="ClientBin/Silverlight30.xap" /&gt; 

        &lt;param name="onError" value="onSilverlightError" /&gt; 

        &lt;param name="background" value="white" /&gt; 

        &lt;param name="minRuntimeVersion" value="3.0.40624.0" /&gt; 

        &lt;param name="autoUpgrade" value="true" /&gt; 

        &lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0" style="text-decoration: none"&gt; 

                &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" 

                        style="border-style: none" /&gt; 

        &lt;/a&gt; 

&lt;/object&gt; 

        &lt;param name="source" value="ClientBin/Silverlight30.LocalConnection.xap" /&gt; 

&lt;/object&gt;

OK

     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/342768,如需转载请自行联系原作者