<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
{
/// <summary>
/// 一个简单的 WCF 服务
/// </summary>
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class BinaryXmlService
{
[OperationContract]
public string Hello(string name)
{
return "Hello: " + name;
}
}
}
Web.config
<system.serviceModel>
<bindings>
<customBinding>
<binding name="customBinding0">
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<behaviors>
<serviceBehaviors>
<behavior name="Silverlight30.Service.BinaryXmlServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="Silverlight30.Service.BinaryXmlServiceBehavior"
name="Silverlight30.Service.BinaryXmlService">
<endpoint address="" binding="customBinding" bindingConfiguration="customBinding0"
contract="Silverlight30.Service.BinaryXmlService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
客户端
BinaryXml.xaml
<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">
<Grid x:Name="LayoutRoot">
<StackPanel Orientation="Horizontal" Height="30">
<!--支持二进制 XML 通信-->
<TextBox x:Name="txtName" Text="webabcd" />
<Button x:Name="btnHelloConfig" Content="引用服务后(使用代理),通过配置的方式与服务端做二进制XML通信" Click="btnHelloConfig_Click" />
<Button x:Name="btnHelloCoding" Content="引用服务后(使用代理),通过编程的方式与服务端做二进制XML通信" Click="btnHelloCoding_Click" />
</StackPanel>
</Grid>
</navigation:Page>
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<HelloCompletedEventArgs>(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
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="CustomBinding_BinaryXmlService">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:8616/BinaryXmlService.svc"
binding="customBinding" bindingConfiguration="CustomBinding_BinaryXmlService"
contract="BinaryXmlService.BinaryXmlService" name="CustomBinding_BinaryXmlService" />
</client>
</system.serviceModel>
</configuration>
2、本地连接的演示
Silverlight 程序 1
LocalConnection.xaml
<navigation:Page x:Class="Silverlight30.Communication.LocalConnection"
Title="LocalConnection Page">
<StackPanel>
<!--结合 Silverlight30.LocalConnection/MainPage.xaml 中的项目演示 Silverlight 对本地连接的支持-->
<TextBlock Text="我是 abc" />
<Button x:Name="btnSubmit" Content="提交" Click="btnSubmit_Click" />
<TextBlock x:Name="lblResult" />
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<MessageReceivedEventArgs>(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
<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">
<!--结合 Silverlight30/Communication/LocalConnection.xaml 中的项目演示 Silverlight 对本地连接的支持-->
<TextBlock Text="我是 xyz" />
</UserControl>
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
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
height="100%" style="float: left; width: 50%">
<param name="source" value="ClientBin/Silverlight30.xap" />
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="3.0.40624.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration: none">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight"
style="border-style: none" />
</a>
</object>
<param name="source" value="ClientBin/Silverlight30.LocalConnection.xap" />
</object>
OK
本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/342768,如需转载请自行联系原作者