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

简介:

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

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

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

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

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


2182da093731f570f09b59c4aeb1c434c4fc2d64

具体的开发步骤如下。

建立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所示。


f027d734740c65677344f00d161b61930eaa4a32
相关文章
|
4月前
|
存储 Serverless 数据库
科普文:云计算服务类型IaaS, PaaS, SaaS, BaaS, Faas说明
本文介绍了云计算服务的几种主要类型,包括IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)、BaaS(后端即服务)和FaaS(函数即服务)。每种服务模式提供了不同的服务层次和功能,从基础设施的提供到应用的开发和运行,再到软件的交付使用,满足了企业和个人用户在不同场景下的需求。文章详细阐述了每种服务模式的特点、优势和缺点,并列举了相应的示例。云计算服务的发展始于21世纪初,随着互联网技术的普及,这些服务模式不断演进,为企业和个人带来了高效、灵活的解决方案。然而,使用这些服务时也需要注意服务的稳定性、数据安全性和成本等问题。
2606 4
|
1月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
128 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
1月前
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
87 13
|
2月前
|
Ubuntu 网络协议 Linux
快速部署WSL(Windows Subsystem for Linux)
WSL提供了一种轻量级的方法,使开发者能够在Windows上无缝运行Linux环境。通过本文介绍的步骤,可以快速安装、配置和使用WSL,以满足开发和测试的需求。
188 8
|
3月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
217 4
|
4月前
|
边缘计算 安全 网络安全
|
4月前
|
存储 安全 网络安全
云端盾牌:云计算时代的网络安全守护在数字化浪潮中,云计算以其高效、灵活的特性成为企业转型的加速器。然而,伴随其迅猛发展,网络安全问题亦如影随形,成为悬在每个组织头顶的达摩克利斯之剑。本文旨在探讨云计算服务中的网络安全挑战,分析信息安全的重要性,并提出相应对策,以期为企业构建一道坚实的云端防护网。
在当今这个数据驱动的时代,云计算已成为推动创新与效率的关键力量。它允许用户随时随地访问强大的计算资源,降低了企业的运营成本,加速了产品上市时间。但随之而来的网络威胁也日益猖獗,尤其是对于依赖云服务的企业而言,数据泄露、身份盗用等安全事件频发,不仅造成经济损失,更严重损害品牌信誉。本文深入剖析云计算环境中的安全风险,强调建立健全的信息安全管理机制的重要性,并分享一系列有效策略,旨在帮助企业和个人用户在享受云服务带来的便利的同时,也能构筑起强有力的网络防线。
|
4月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务
|
2月前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
在数字化浪潮中,云计算如同一股不可阻挡的力量,推动着企业和个人用户步入一个高效、便捷的新时代。然而,随之而来的网络安全问题也如影随形,成为制约云计算发展的阿喀琉斯之踵。本文将探讨云计算服务中的网络安全挑战,揭示信息保护的重要性,并提供实用的安全策略,旨在为读者呈现一场技术与安全的较量,同时指出如何在享受云服务带来的便利的同时,确保数据的安全和隐私。
44 6
|
2月前
|
存储 人工智能 安全
云计算与网络安全:技术融合与挑战
在数字化时代的浪潮中,云计算和网络安全已成为推动社会进步的两大关键技术。本文将探讨云计算服务的发展,网络安全的重要性,以及信息安全技术的演进。我们将通过实例分析,揭示云服务如何增强数据保护,网络安全措施如何应对新兴威胁,以及信息安全技术的创新如何为企业带来竞争优势。文章旨在为读者提供对云计算和网络安全领域的深入理解,并展示它们如何共同塑造我们的未来。