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

作者:金沙易记域名4166am

[索引页]
[源码下载]

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

作者:webabcd

介绍
Silverlight 3.0 通信的新增功能

  • 二进制XML通信 - 与 WCF 服务间通信,可以使用二进制 XML 传递数据(提高传输性能) 
  • 本地连接 - 允许客户端的两个 Silverlight 程序之间直接进行通信(不用通过服务端)

在线DEMO

示例
1、以二进制 XML 传递数据的演示
服务端(WCF)
BinaryXmlService.svc

图片 1using System;
图片 2using System.Linq;
图片 3using System.Runtime.Serialization;
图片 4using System.ServiceModel;
图片 5using System.ServiceModel.Activation;
图片 6using System.Collections.Generic;
图片 7using System.Text;
图片 8
图片 9namespace Silverlight30.Service
图片 10图片 11图片 12{
图片 13图片 14    /**//// <summary>
图片 15    /// 一个简单的 WCF 服务
图片 16    /// </summary>
图片 17    [ServiceContract]
图片 18    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
图片 19    public class BinaryXmlService
图片 20图片 21    图片 22{
图片 23        [OperationContract]
图片 24        public string Hello(string name)
图片 25图片 26        图片 27{
图片 28            return "Hello: " + name;
图片 29        }
图片 30    }
图片 31}
图片 32

Web.config

图片 33<system.serviceModel>
图片 34    <bindings>
图片 35        <customBinding>
图片 36            <binding name="customBinding0">
图片 37                <binaryMessageEncoding />
图片 38                <httpTransport />
图片 39            </binding>
图片 40        </customBinding>
图片 41    </bindings>
图片 42    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
图片 43    <behaviors>
图片 44        <serviceBehaviors>
图片 45            <behavior name="Silverlight30.Service.BinaryXmlServiceBehavior">
图片 46                <serviceMetadata httpGetEnabled="true" />
图片 47                <serviceDebug includeExceptionDetailInFaults="false" />
图片 48            </behavior>
图片 49        </serviceBehaviors>
图片 50    </behaviors>
图片 51    <services>
图片 52        <service behaviorConfiguration="Silverlight30.Service.BinaryXmlServiceBehavior"
图片 53            name="Silverlight30.Service.BinaryXmlService">
图片 54            <endpoint address="" binding="customBinding" bindingConfiguration="customBinding0"
图片 55                contract="Silverlight30.Service.BinaryXmlService" />
图片 56            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
图片 57        </service>
图片 58    </services>
图片 59</system.serviceModel>

客户端
BinaryXml.xaml

图片 60<navigation:Page x:Class="Silverlight30.Communication.BinaryXml" 
图片 61           xmlns="" 
图片 62           xmlns:x="" 
图片 63           xmlns:d=""
图片 64           xmlns:mc=""
图片 65           mc:Ignorable="d"
图片 66           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
图片 67           d:DesignWidth="640" d:DesignHeight="480"
图片 68           Title="BinaryXml Page">
图片 69    <Grid x:Name="LayoutRoot">
图片 70        <StackPanel Orientation="Horizontal" Height="30">
图片 71        
图片 72            <!--支持二进制 XML 通信-->
图片 73        
图片 74            <TextBox x:Name="txtName" Text="webabcd" />
图片 75            <Button x:Name="btnHelloConfig" Content="引用服务后(使用代理),通过配置的方式与服务端做二进制XML通信" Click="btnHelloConfig_Click" />
图片 76            <Button x:Name="btnHelloCoding" Content="引用服务后(使用代理),通过编程的方式与服务端做二进制XML通信" Click="btnHelloCoding_Click" />
图片 77稳扎稳打Silverlight(39) - 3.0通信之二进制XML通信, 本地连接。        
图片 78        </StackPanel>
图片 79稳扎稳打Silverlight(39) - 3.0通信之二进制XML通信, 本地连接。    </Grid>
图片 80稳扎稳打Silverlight(39) - 3.0通信之二进制XML通信, 本地连接。</navigation:Page>
图片 81

BinaryXml.xaml.cs

图片 82using System;
图片 83using System.Collections.Generic;
图片 84using System.Linq;
图片 85using System.Net;
图片 86using System.Windows;
图片 87using System.Windows.Controls;
图片 88using System.Windows.Documents;
图片 89using System.Windows.Input;
图片 90using System.Windows.Media;
图片 91using System.Windows.Media.Animation;
图片 92using System.Windows.Shapes;
图片 93using System.Windows.Navigation;
图片 94
图片 95using Silverlight30.BinaryXmlService;
图片 96using System.ServiceModel.Channels;
图片 97using System.ServiceModel;
图片 98
图片 99namespace Silverlight30.Communication
图片 100图片 101图片 102{
图片 103    public partial class BinaryXml : Page
图片 104图片 105    图片 106{
图片 107        public BinaryXml()
图片 108图片 109        图片 110{
图片 111            InitializeComponent();
图片 112        }
图片 113
图片 114        void client_HelloCompleted(object sender, HelloCompletedEventArgs e)
图片 115图片 116        图片 117{
图片 118            if (e.Error == null)
图片 119                MessageBox.Show(e.Result);
图片 120            else
图片 121                MessageBox.Show(e.Error.ToString());
图片 122        }
图片 123
图片 124        private void btnHelloConfig_Click(object sender, RoutedEventArgs e)
图片 125图片 126        图片 127{
图片 128            // 通过配置文件(ServiceReferences.ClientConfig)的方式调用以二进制 XML 通信的 WCF 服务(需要使用代理)
图片 129            BinaryXmlServiceClient client = new BinaryXmlServiceClient();
图片 130            client.HelloCompleted += new EventHandler<HelloCompletedEventArgs>(client_HelloCompleted);
图片 131            client.HelloAsync(txtName.Text);
图片 132        }
图片 133
图片 134        private void btnHelloCoding_Click(object sender, RoutedEventArgs e)
图片 135图片 136        图片 137{
图片 138            // 通过编程的方式调用以二进制 XML 通信的 WCF 服务(需要使用代理)
图片 139            BinaryMessageEncodingBindingElement binary = new BinaryMessageEncodingBindingElement();
图片 140            HttpTransportBindingElement transport = new HttpTransportBindingElement();
图片 141            CustomBinding binding = new CustomBinding(binary, transport);
图片 142            EndpointAddress address = new EndpointAddress("");
图片 143            BinaryXmlServiceClient client = new BinaryXmlServiceClient(binding, address);
图片 144            client.HelloCompleted += new EventHandler<HelloCompletedEventArgs>(client_HelloCompleted);
图片 145            client.HelloAsync(txtName.Text);
图片 146        }
图片 147    }
图片 148}
图片 149

ServiceReferences.ClientConfig

图片 150<configuration>
图片 151    <system.serviceModel>
图片 152        <bindings>
图片 153            <customBinding>
图片 154                <binding name="CustomBinding_BinaryXmlService">
图片 155                    <binaryMessageEncoding />
图片 156                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
图片 157                </binding>
图片 158            </customBinding>
图片 159        </bindings>
图片 160        <client>
图片 161            <endpoint address=""
图片 162                binding="customBinding" bindingConfiguration="CustomBinding_BinaryXmlService"
图片 163                contract="BinaryXmlService.BinaryXmlService" name="CustomBinding_BinaryXmlService" />
图片 164        </client>
图片 165    </system.serviceModel>
图片 166</configuration>
图片 167

2、本地连接的演示
Silverlight 程序 1
LocalConnection.xaml

图片 168<navigation:Page x:Class="Silverlight30.Communication.LocalConnection" 
图片 169           xmlns="" 
图片 170           xmlns:x="" 
图片 171           xmlns:d=""
图片 172           xmlns:mc=""
图片 173           mc:Ignorable="d"
图片 174           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
图片 175           d:DesignWidth="640" d:DesignHeight="480"
图片 176           Title="LocalConnection Page">
图片 177    <Grid x:Name="LayoutRoot">
图片 178        <StackPanel>
图片 179        
图片 180            <!--结合 Silverlight30.LocalConnection/MainPage.xaml 中的项目演示 Silverlight 对本地连接的支持-->
图片 181        
图片 182            <TextBlock Text="我是 abc" />
图片 183            <Button x:Name="btnSubmit" Content="提交" Click="btnSubmit_Click" />
图片 184            <TextBlock x:Name="lblResult" />
图片 185            
图片 186        </StackPanel>
图片 187    </Grid>
图片 188</navigation:Page>
图片 189

LocalConnection.xaml.cs

图片 190图片 191/**//*
图片 192 * LocalMessageReceiver - 本地连接接收器
图片 193 *     ReceiverName - 接收器的名称。与另一个 Silverlight 程序所设置的发送器的接收器名称相对应
图片 194 *     AllowedSenderDomains - 信任的发送器所属域名列表
图片 195 *     DisableSenderTrustCheck - 是否不理会 Vista 下的 IE 7 的保护模式。默认值为 false
图片 196 *     NameScope - 接收器名称是在同域唯一还是在全域唯一(ReceiverNameScope.Domain 同域唯一,默认值;ReceiverNameScope.Global 全域唯一)
图片 197 *     Listen() - 开始监听发送过来的信息
图片 198 *     MessageReceived事件 - 接收完成事件
图片 199 *     
图片 200 * LocalMessageSender - 本地连接发送器
图片 201 *     ReceiverName - 接收器的名称。与另一个 Silverlight 程序所设置的接收器的接收器名称相对应
图片 202 *     ReceiverDomain - 将要发送至的接收器所属域名
图片 203 *     SendAsync(string message, object userState) - 异步发送数据。(参数1:需要发送的信息;参数2:上下文,可以传递给发送完成事件)
图片 204 *     SendCompleted事件 - 发送完成事件
图片 205 */
图片 206
图片 207using System;
图片 208using System.Collections.Generic;
图片 209using System.Linq;
图片 210using System.Net;
图片 211using System.Windows;
图片 212using System.Windows.Controls;
图片 213using System.Windows.Documents;
图片 214using System.Windows.Input;
图片 215using System.Windows.Media;
图片 216using System.Windows.Media.Animation;
图片 217using System.Windows.Shapes;
图片 218using System.Windows.Navigation;
图片 219using System.Windows.Messaging;
图片 220
图片 221namespace Silverlight30.Communication
图片 222图片 223图片 224{
图片 225    public partial class LocalConnection : Page
图片 226图片 227    图片 228{
图片 229        LocalMessageSender _sender;
图片 230
图片 231        public LocalConnection()
图片 232图片 233        图片 234{
图片 235            InitializeComponent();
图片 236
图片 237            this.Loaded += new RoutedEventHandler(LocalConnection_Loaded);
图片 238        }
图片 239
图片 240        void LocalConnection_Loaded(object sender, RoutedEventArgs e)
图片 241图片 242        图片 243{
图片 244            _sender = new LocalMessageSender("abc");
图片 245
图片 246            LocalMessageReceiver receiver = new LocalMessageReceiver("xyz");
图片 247            receiver.MessageReceived += new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);
图片 248            receiver.Listen();            
图片 249        }
图片 250
图片 251        void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
图片 252图片 253        图片 254{
图片 255            lblResult.Text += e.Message + "rn";
图片 256        }
图片 257
图片 258        private void btnSubmit_Click(object sender, RoutedEventArgs e)
图片 259图片 260        图片 261{
图片 262            _sender.SendAsync("在 abc 单击了按钮");
图片 263        }
图片 264    }
图片 265}
图片 266

Silverlight 程序 2
Silverlight30.LocalConnection/MainPage.xaml

图片 267<UserControl x:Class="Silverlight30.LocalConnection.MainPage"
图片 268    xmlns="" 
图片 269    xmlns:x=""
图片 270    xmlns:d="" xmlns:mc="" 
图片 271    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
图片 272    <Grid x:Name="LayoutRoot">
图片 273        <StackPanel>
图片 274        
图片 275            <!--结合 Silverlight30/Communication/LocalConnection.xaml 中的项目演示 Silverlight 对本地连接的支持-->
图片 276        
图片 277            <TextBlock Text="我是 xyz" />
图片 278            <Button x:Name="btnSubmit" Content="提交" Click="btnSubmit_Click" />
图片 279            <TextBlock x:Name="lblResult" />
图片 280            
图片 281        </StackPanel>
图片 282    </Grid>
图片 283</UserControl>
图片 284

Silverlight30.LocalConnection/MainPage.xaml.cs

图片 285using System;
图片 286using System.Collections.Generic;
图片 287using System.Linq;
图片 288using System.Net;
图片 289using System.Windows;
图片 290using System.Windows.Controls;
图片 291using System.Windows.Documents;
图片 292using System.Windows.Input;
图片 293using System.Windows.Media;
图片 294using System.Windows.Media.Animation;
图片 295using System.Windows.Shapes;
图片 296
图片 297using System.Windows.Messaging;
图片 298
图片 299namespace Silverlight30.LocalConnection
图片 300图片 301图片 302{
图片 303    public partial class MainPage : UserControl
图片 304图片 305    图片 306{
图片 307        LocalMessageSender _sender;
图片 308
图片 309        public MainPage()
图片 310图片 311        图片 312{
图片 313            InitializeComponent();
图片 314
图片 315            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
图片 316        }
图片 317
图片 318        void MainPage_Loaded(object sender, RoutedEventArgs e)
图片 319图片 320        图片 321{
图片 322            _sender = new LocalMessageSender("xyz");
图片 323
图片 324            LocalMessageReceiver receiver = new LocalMessageReceiver("abc");
图片 325            receiver.MessageReceived += new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);
图片 326            receiver.Listen();
图片 327        }
图片 328
图片 329        void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
图片 330图片 331        图片 332{
图片 333            lblResult.Text += e.Message + Environment.NewLine;
图片 334        }
图片 335
图片 336        private void btnSubmit_Click(object sender, RoutedEventArgs e)
图片 337图片 338        图片 339{
图片 340            _sender.SendAsync("在 xyz 单击了按钮");
图片 341        }
图片 342    }
图片 343}
图片 344

以上两个 Silverlight 程序间可以进行本地通信
Silverlight30.LocalConnectionTestPage.html

图片 345<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
图片 346    height="100%" style="float: left; width: 50%">
图片 347    <param name="source" value="ClientBin/Silverlight30.xap" />
图片 348    <param name="onError" value="onSilverlightError" />
图片 349    <param name="background" value="white" />
图片 350    <param name="minRuntimeVersion" value="3.0.40624.0" />
图片 351    <param name="autoUpgrade" value="true" />
图片 352    <a href="" style="text-decoration: none">
图片 353        <img src="" alt="Get Microsoft Silverlight"
图片 354            style="border-style: none" />
图片 355    </a>
图片 356</object>
图片 357<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
图片 358    height="100%" style="float: left; width: 50%">
图片 359    <param name="source" value="ClientBin/Silverlight30.LocalConnection.xap" />
图片 360    <param name="onError" value="onSilverlightError" />
图片 361    <param name="background" value="white" />
图片 362    <param name="minRuntimeVersion" value="3.0.40624.0" />
图片 363    <param name="autoUpgrade" value="true" />
图片 364    <a href="" style="text-decoration: none">
图片 365        <img src="" alt="Get Microsoft Silverlight"
图片 366            style="border-style: none" />
图片 367    </a>
图片 368</object>

OK
[源码下载]

本文由金沙易记域名4166am发布,转载请注明来源

关键词: