本节书摘来自异步社区《微软云计算Windows Azure开发与部署权威指南》一书中的第6章,第6.8节,作者: 尹成 , 郝庭毅 , 张俊强 , 孙奉刚 , 寇睿明 更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.8 AppFabric服务总线的多播服务开发

本节将创建一个简单的网络中继聊天应用程序,利用该应用程序来让大家对服务总线的多播服务有一个认识。多播通信允许在一个URI上有多个监听者和发送者,每一个动作执行者既是监听者又是发送者。与多播模式对应的是简单的发布—订阅模式。

为了实现多播消息的模式,服务总线提供了另一个绑定,称为“netEventRelayBinding”。这个绑定在WCF上的发布—订阅通信模式,其他的WCF内置的绑定都不支持。netEventRelayBinding允许多个应用程序向一个端点订阅和发送消息,任何发送到该端点的消息会被所有的应用程序接收。

服务总线通过允许多个监听者在第一个发送者指定的URI上注册来实现netEventRelayBinding。每个拥有一个端点来监听相同URI的主机服务都变成了一个订阅者。当一个客户端向该URI发送消息时,该消息就被发送给了当前所有订阅的服务终端。图6-73所示为多播服务的简单原理图。


具体的开发步骤如下。

建立Internet中继聊天服务
① 以管理员身份运行Visual Studio 2010,新创建项目,选择Visual C#的控制台工程,命名为“MulticastDemo”,单击“确定”按钮。

② 在“解决方案资源管理器”中找到MulticastDemo工程下的引用,单击右键选择“添加引用”,添加对System.ServiceModel.dll、Microsoft.ServiceBus.dll,System.IdentityModel.dll、System.Runtime. Serialization.dll的引用,前者在“.NET”选项卡中可以找到,后者在“浏览”选项卡中本地SDK安装目录下可以找到。

③ 创建一个接口文件作为服务契约。右键单击MulticastDemo工程,选择“添加”→“新建项”,选择接口文件,命名为“MulticastContract.cs”。下面是修改和添加后的该文件代码。

namespace Microsoft.ServiceBus.Samples
{
using System;
using System.ServiceModel;[ServiceContract(Name = "IMulticastContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
publicinterfaceIMulticastContract{[OperationContract(IsOneWay=true)]
void Hello(string nickname);[OperationContract(IsOneWay = true)]
void Chat(string nickname, string text);[OperationContract(IsOneWay = true)]
void Bye(string nickname);}publicinterfaceIMulticastChannel : IMulticastContract, IClientChannel { }
}

由于netEventRelayBinding要求WCF接口协议智能暴露单向(one way)的操作,因此所有的操作都需要标记为“IsOneWay=true”,来表明该操作只有单一的输入信息,没有对应的输出信息。有一些操作没有返回值,并且客户端并不关心其调用成功与否,此时可以将接口协议标记为one-way,此类接口返回值必须声明为void,任何在服务器抛出的异常也不会返回客户端。

④ 创建服务契约的实现类MulticastService.cs。右键单击MulticastDemo工程,选择“添加”→“新建项”,选择类文件,命名为“MulticastService.cs”。该类实现MulticastContract接口,实现代码如下。

namespace Microsoft.ServiceBus.Samples
{
using System;
using System.ServiceModel;[ServiceBehavior(Name = "MulticastService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
classMulticastService : IMulticastContract{
voidIMulticastContract.Hello(string nickname){
Console.WriteLine("[" + nickname + "] joins");}voidIMulticastContract.Chat(string nickname, string text){
Console.WriteLine("[" + nickname + "] says: " + text);}voidIMulticastContract.Bye(string nickname){
Console.WriteLine("[" + nickname + "] leaves");}}
}

⑤ 打开Program.cs文件,将其命名空间也改为Microsoft.ServiceBus.Sample,添加对System. Globalization和System.ServiceModel命名空间的引用,具体代码如下。

namespace Microsoft.ServiceBus.Samples
{
using System;
using System.Globalization;
using System.ServiceModel;

⑥ 为Program类添加一个构造方法,方法中设定服务总线中继的连接模式,具体代码如下。

private Program()
{
//有Tcp、Http、AutoDetect三种模式,本例使用AutoDetect
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect; ;}
⑦ 为Program类添加Run()方法,方法体如下。privatevoid Run()
{
//读取会话名称和聊天人昵称
Console.Write("What do you want to call your chat session? ");
string session = Console.ReadLine();
Console.Write("Your Chat Nickname: ");
string chatNickname = Console.ReadLine();//访问控制,需要输入IssuerName和IssuerSecret,要与下文的命名空间对应
TransportClientEndpointBehavior relayCredentials = newTransportClientEndpointBehavior();relayCredentials.CredentialType = TransportClientCredentialType.SharedSecret;relayCredentials.Credentials.SharedSecret.IssuerName = "insertYourIssuerNameHere";relayCredentials.Credentials.SharedSecret.IssuerSecret = "insertYourIssuerSecretHere";//生成回话对应的唯一URI,需要输入读者申请的命名空间
Uri serviceAddress = ServiceBusEnvironment.CreateServiceUri("sb", "insertYourNamespaceHere",
String.Format(CultureInfo.InvariantCulture, "{0}/MulticastService/", session));
ServiceHost host = newServiceHost(typeof(MulticastService), serviceAddress);host.Description.Endpoints[0].Behaviors.Add(relayCredentials);host.Open();//创建通道并打开
ChannelFactory<IMulticastChannel> channelFactory =
newChannelFactory<IMulticastChannel>("RelayEndpoint", newEndpointAddress(serviceAddress));channelFactory.Endpoint.Behaviors.Add(relayCredentials);
IMulticastChannel channel = channelFactory.CreateChannel();channel.Open();Console.WriteLine("\nPress [Enter] to exit\n");//上线提示channel.Hello(chatNickname);//群聊
string input = Console.ReadLine();
while (input != String.Empty){channel.Chat(chatNickname, input);input = Console.ReadLine();}//下线提示channel.Bye(chatNickname);//关闭通道和主机服务channel.Close();channelFactory.Close();host.Close();
}

⑧ 在Main函数中生成Program实例并调用其Run()方法,最终Program.cs的完整代码如下。

namespace Microsoft.ServiceBus.Samples
{
using System;
using System.Globalization;
using System.ServiceModel;classProgram{
private Program(){
//有Tcp、Http、AutoDetect三种模式,本例使用AutoDetect
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect; ;}privatevoid Run(){
//读取会话名称和聊天人昵称
Console.Write("What do you want to call your chat session? ");
string session = Console.ReadLine();
Console.Write("Your Chat Nickname: ");
string chatNickname = Console.ReadLine();//访问控制,需要输入IssuerName和IssuerSecret,要与下文的命名空间对应
TransportClientEndpointBehavior relayCredentials = newTransportClientEndpointBehavior();relayCredentials.CredentialType = TransportClientCredentialType.SharedSecret;relayCredentials.Credentials.SharedSecret.IssuerName = "insertYourIssuerNameHere";relayCredentials.Credentials.SharedSecret.IssuerSecret = "insertYourIssuerSecretHere";//生成会话对应的唯一URI,将服务托管到服务总线上,需要输入读者申请的命名空间
Uri serviceAddress = ServiceBusEnvironment.CreateServiceUri("sb", "insertYourNamespaceHere",
String.Format(CultureInfo.InvariantCulture, "{0}/MulticastService/", session));
ServiceHost host = newServiceHost(typeof(MulticastService), serviceAddress);host.Description.Endpoints[0].Behaviors.Add(relayCredentials);host.Open();//创建通道并打开
ChannelFactory<IMulticastChannel> channelFactory =
newChannelFactory<IMulticastChannel>("RelayEndpoint", newEndpointAddress(serviceAddress));channelFactory.Endpoint.Behaviors.Add(relayCredentials);
IMulticastChannel channel = channelFactory.CreateChannel();channel.Open();Console.WriteLine("\nPress [Enter] to exit\n");//上线提示channel.Hello(chatNickname);//群聊
string input = Console.ReadLine();
while (input != String.Empty){channel.Chat(chatNickname, input);input = Console.ReadLine();}//下线提示channel.Bye(chatNickname);//关闭通道和主机服务channel.Close();channelFactory.Close();host.Close();}staticvoid (string[] args){
Program programInstance = newProgram();programInstance.Run();}}
}

⑨ 右键单击MulticastDemo工程,选择“添加”→“新建项”,选择“应用程序配置文件”,单击“确定”按钮。添加后的App.config代码如下。

<?xmlversion="1.0"?>
<configuration>
<system.serviceModel><!--添加netEventRelayBinding扩展名,注意Version值要与读者安装的ServiceBus版本一致-->
<extensions>
<bindingExtensions>
<addname="netEventRelayBinding"
type="Microsoft.ServiceBus.Configuration.NetEventRelayBindingCollectionElement, Microsoft.ServiceBus, Version=.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</bindingExtensions>
</extensions><bindings>
<netEventRelayBinding>
<bindingname="default"/>
</netEventRelayBinding>
</bindings><!--客户端-->
<client>
<endpointname="RelayEndpoint"
contract="Microsoft.ServiceBus.Samples.IMulticastContract"
binding="netEventRelayBinding"
bindingConfiguration="default"
address=""/>
</client><!--服务端-->
<services>
<servicename="Microsoft.ServiceBus.Samples.MulticastService">
<endpointname="RelayEndpoint"
contract="Microsoft.ServiceBus.Samples.IMulticastContract"
binding="netEventRelayBinding"
bindingConfiguration="default"
address=""/>
</service>
</services></system.serviceModel>
</configuration>

10 双击MulticastDemo工程下的Properties文件,查看“应用程序”选项卡中的“目标框架”,如果是“.NET Framework Client Profile”,请改为对应的“.NET Framework ”。右键单击MulticastDemo工程,选择“调试”→“启动新实例”,连续启动多个实例,使用相同的会话名就可以实现多人聊天,如图6-74所示。


《微软云计算Windows Azure开发与部署权威指南》——6.8 AppFabric服务总线的多播服务开发...相关推荐

  1. 云计算 第四章 微软云计算 Windows Azure

    文章目录 第四章 微软云计算 Windows Azure 4.1 微软云计算平台 1.传统的企业和用户在开发和部署自己的应用程序主要有两种方式 2.微软的云计算技术 3.Windows Azure平台 ...

  2. 微软云计算 Windows Azure“腾云驾雾”

    在众说纷"云"的时代,怎么能少得了微软的身影呢?作为微软的公有云解决方案,Windows Azure指的是运行在微软数据中心的云计算平台.从结构上讲,Windows Azure平台 ...

  3. 《微软云计算Microsoft Azure部署与管理指南》即将上市!!!

    大家好,本人新作<微软云计算Microsoft Azure部署与管理指南>即将与广大读者见面,由电子工业出版社出版.希望大家能关注此书,并推荐给身边的好友和技术人员. 众所周知,Micro ...

  4. 微软云之路——Windows Azure 学习

    今天参与了灵通公司举办的微软云之路Windows Azure的培训,主要讲了Windows Azure提供的PaaS服务. 云端提供开发平台和服务器资源.具体先在云端建立host机,数据库账户.再在本 ...

  5. 深入浅出介绍微软的Windows Azure(一)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows Azure到底是一个什么技术. 总是在知乎上看到各种比较Windows Azure和阿里云的帖子.大家都在讨论哪个好用.其实 ...

  6. 微软服务器故障,微软解释Windows Azure故障原因

    Windows Azure是微软推出的云计算版本操作系统,上周末Windows Azure服务出现故障,微软MSDN今日发表文章,Azure服务中断是由于操作系统升级时出现故障,并且表示Windows ...

  7. Windows Azure Pack 安装部署

    Windows Azure Pack作为微软新推出的云管理与租用门户,拥有与公有云Windows Azure接近的用户体验,并且能够将私有云与公有云完美结合起来,在之前的文章中有了相关的简单介绍.下面 ...

  8. 2017年成为全栈开发工程师的权威指南

    http://www.css88.com/archives/7529?utm_source=tuicool&utm_medium=referral 根据 2016年 Stack Overflo ...

  9. 试用微软官方 windows Azure云 服务器

    进入申请表填写网页: 注册成功,按如下操作. 输入试用的域名: 登陆相关信息. 付款信息: 同意付款协议,注意,此处时间有点长,请等待一下. 进入支付宝付款页面: 验证付款: 付款成功: 进入试用主页 ...

最新文章

  1. Linux 下 Jni 实现
  2. 活动 | 参与《我的 ,2019 不一样》投稿,千元奖品,等你拿!
  3. Dijkstra's algorithm (C++)
  4. Spring框架中有哪些不同类型的事件
  5. matlab中std和std2的区别,matlab 关于std,std2,mean,mean2初步认识
  6. 初探ArrayList之删除
  7. P2863 [USACO06JAN]牛的舞会The Cow Prom
  8. python课后题答案第一章_Python程序设计课后习题答案-第一单元
  9. 与虚拟机连接出现ora-12514错误解决方法
  10. 密码密文 android,Android开发之密码明文密文切换显示
  11. rpa操作excel_一文看懂RPA与Excel宏的区别
  12. linux 繁体转简体,linux2 简体中文转繁体
  13. Android字体、字重
  14. MySQL数据库表结构设计优化技巧总结
  15. Person Search
  16. 整理的strace命令参考文档
  17. java套接字创建失败_Linux的文件描述符个数限制导致创建文件(或socket)失败的问题...
  18. 第二代商用计算机,紫光计算机第二代商用台式机 Unis 526S/526T G2 上市
  19. layabox使用Animation创作一个简单的动画
  20. ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析

热门文章

  1. alert弹出[object Object]解决方法
  2. php获取文件夹下所有文件名(php遍历目录)
  3. linux mint 安装shutter
  4. 【数学】凸函数与詹森不等式(琴生不等式)解析
  5. 计算机组成原理白中英第七章,计算机组成原理第七章课件(白中英版).ppt
  6. 以下是一些常用的上位机开发工具:
  7. iptables端口复用
  8. 【热门】男孩取名:代表希望与志向的男孩名字
  9. web服务器带宽的数据统计和估算
  10. C# 设计原则 之 迪米特 原则