对等通道安全聊天

此示例演示如何将基于密码的身份验证与 NetPeerTcpBinding 绑定结合使用,该绑定使用对等通道提供多方通信。此示例是入门示例的变体。有关 Windows Communication Foundation (WCF) 的概述,请参阅入门示例

在此示例中,应用程序实例是自承载的控制台应用程序。

与其他的传输绑定示例不同,此示例为演示多方通信而使用 IChat 协定接口。所有实例都实现此协定以接收消息,并使用相同的协定创建代理,以便将消息发送给网格。这可以通过创建网格的 DuplexChannel 进行演示。

提示

本主题的最后介绍了此示例的设置过程和生成说明。

理解示例中的绑定配置过程涉及到以下对等通道概念:

  • 对等解析程序**负责将网格 ID 解析为网格中若干节点的终结点地址。
  • 网格**是由网格 ID 标识的对等节点的命名集合。
  • 对等节点**是参与网格的应用程序的实例。
  • 网格 ID 标识网格中终结点地址的主机部分。这些地址的示例有“net.p2p://chatMesh/servicemodelsamples/chat”或“net.p2p://broadcastMesh/servicemodelsamples/announcements”。其中的 chatMesh 和 broadcastMesh 就是网格 ID。
  • 参与某个网格的所有客户端都使用相同的网格 ID,但有可能使用不同的路径和服务。寻址到特定终结点地址的消息被发送到使用该地址的所有对等通道。

当由于打开对等通道而使对等节点打开时,它使用对等解析程序将网格 ID 解析为其他几个对等节点要连接到的地址。这样将创建一个互连节点网格,并允许消息在整个网格中进行传播。

PeerTransportCredentialType 指定网格中的对等端相互之间如何进行身份验证。可以在绑定配置中、NetPeerTcpBinding 对象中或使用 PeerTransportBindingElement 指定此属性。在 Peer 属性中指定相应凭据的 ClientCredentialSettings(或 ServiceCredentialSettings)实例必须根据使用情况添加到通道工厂或 ServiceHost 上的行为集合中。

  1. 此示例使用密码身份验证模式保护对等通道(这是默认模式)。通过在邻居之间建立安全的连接并交换此密码的转换,可以实现这一点。如果指定了 PasswordClientCredentialSettings.Peer 属性必须带有一个有效的密码,另外还可以带有一个 X509Certificate2 实例(使用 SetSelfCertificate)。

绑定是在应用程序的配置文件中指定的。绑定类型在终结点元素的 Binding 属性中指定,如下面的示例所示。

<client>
   <!-- chat instance participating in the mesh -->
   <endpoint name="SecureChatEndpoint"
            address="net.p2p://SecureChatMesh/servicemodelsamples/chat"
             binding="netPeerTcpBinding"
             bindingConfiguration="SecureChatBinding"
             contract="Microsoft.ServiceModel.Samples.IChat">
   </endpoint>
 </client>

如果使用具有默认行为的 NetPeerTcpBinding 绑定,则将启用基于密码的安全性。绑定元素提供用来设置端口、侦听 IP 地址、解析程序类型、最大消息大小、最大缓冲池大小、读取器配额、对等节点身份验证模式、消息身份验证和超时(对于关闭、打开、发送和接收)的属性。

注意:此示例使用默认的对等解析程序 (PNRP),该解析程序在 Windows Server 2003 中不可用。因此,若要在 Windows Server 2003 上运行此示例,必须使用自定义对等解析程序。请参阅对等通道聊天以查找使用自定义对等解析程序的示例,例如:

<netPeerTcpBinding>
   <binding configurationName="Binding1"> 
    <resolver mode="Custom">
       <customResolver 
            type="MyAppNameSpace.MyCustomPeerResolver, myApp"/>
    </resolver>
   </binding>
</netPeerTcpBinding>

必须使用应用程序来编译包含 MyCustomPeerResolver 的文件。请注意,如果该示例正在多台使用不同平台的计算机上运行,则它们都应该使用同一个解析程序。

此聊天实现还演示如何检索与接收方或发送方实例关联的对等节点,以及如何注册其联机和脱机事件。如果对等节点至少连接到网格中的一个其他对等节点,则会激发联机事件。如果对等节点不再连接到网格中的任何其他对等节点,则会激发脱机事件。

此时,对等通道不会与Service Model Metadata Utility Tool (Svcutil.exe) 集成。因此,无法利用 Svcutil.exe 为发送方生成类型化通道。

运行该示例时,客户端将提示您输入昵称和密码,然后将会显示一条消息,指示它已准备好发送消息。聊天消息将显示在其他客户端控制台窗口中。若要终止客户端,请在客户端的控制台窗口中先按 Q 键,然后按 Enter。

如果启用了跟踪或消息日志记录,则可以监视更深级别上的发送方和接收方活动。“过程”一节描述了如何启用跟踪和消息日志记录。

提示

请注意,该示例当前不处理基础结构引发的所有可能的异常,这一点很重要。如果要在商业/生产环境中使用这些示例,请遵循正确的异常处理最佳做法。

设置、生成和运行示例

  1. 请确保已经执行了 Windows Communication Foundation 示例的一次性安装过程

  2. 若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要用单一计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。

  4. 在 Windows XP SP2 上安装 PNRP(一次性安装):

    1. 在**“控制面板”中,双击“添加或删除程序”**。
    2. 在**“添加或删除程序”对话框中单击“添加/删除 Windows 组件”**。
    3. 在**“Windows 组件向导”**中,选中“网络服务”复选框,然后单击“详细信息”。
    4. 选中“对等”复选框,然后单击“确定”。
    5. 在**“Windows 组件向导”**中,单击“下一步”。
    6. 安装完成时,请单击“完成”。
    7. 从命令 shell 提示符下,使用以下命令启动 PNRP 服务:net start pnrpsvc
  5. 启动该示例的多个实例,每次启动时都输入昵称和密码。各个客户端的昵称应当不同,而所有实例的密码都应保持相同。如果昵称不同但密码匹配,则由应用程序的一个实例发送的聊天消息可由其他所有实例接收。允许多个客户端具有相同的昵称,但不显示从具有相同昵称的客户端发送的消息。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.