65.9K
CodeProject 正在变化。 阅读更多。
Home

在 WCF 4.5 中使用 UdpBinding 进行多播

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (11投票s)

2014年4月9日

CPOL

4分钟阅读

viewsIcon

41435

downloadIcon

1131

本文介绍了 WCF 4.5 中新的 UdpBinding 以及如何使用它来实现多播。

目录

引言

WCF 4.5 提供了对用户数据报协议 (UDP) 的支持。UDP 是一种无连接、轻量级且不可靠的协议,有时被称为“发送即祈祷”,因为它在发送方和接收方之间没有对话。如果接收方未收到消息,发送方将永远不会知道。但是,在错误几率很小的情况下,UDP 非常高效。需要注意的是,UDP 消息不会跨网络边界路由,因此只能在网络内部使用。UDPTCP 快,因为它不对数据包进行错误检查。WCF 4.5 提供了一个基于此协议的新绑定 UdpBinding。由于 UDP 支持多播,因此现在可以使用此绑定编写多播应用程序。此传输适用于发送方需要同时向多个接收方发送小消息,而无需确保任何特定消息是否实际接收或丢失的情况。因此,在此情况下速度比可靠性更重要。

WCF 4.5 中的 UDP 端点

UdpBinding 地址以soap.udp:// 开头(例如,soap.udp://224.0.0.1:8081),并且可以通过 app.config 文件以以下方式在服务中添加 UDP 端点:

<endpoint address="soap.udp://180.18.84.116:8080/StockService/udp" binding="udpBinding" contract="StockServiceLibrary.IStockService" />

也可以通过编程方式将 UDP 端点添加到服务。为此,必须在服务托管项目中添加 System.ServiceModel.Channels.dll 程序集的引用,然后可以按如下方式添加 UDP 端点:

// Creating Host
ServiceHost host = new ServiceHost(typeof(StockService), new Uri("soap.udp://224.0.0.1:40000/StockService"));

// Adding service endpoint
host.AddServiceEndpoint(typeof(IStockService), new UdpBinding(), "udp");

UdpBinding 的特性

  • 互操作性 - .NET 应用程序。可以通过实现此绑定实现的标准 SOAP-over-UDP 规范来实现。
  • 安全性 - 无
  • 会话 – 无
  • 事务 – 无
  • 双工 – 不适用
  • 编码 – Text
  • 流 – 否
  • 消息 - 请求/响应和单向
  • 单向消息是真正的单向单向调用。如果服务不可用,客户端不会抛出异常

UdpBinding 的限制

  • 没有 IIS/WAS 激活支持,因为 WAS 没有 UDP 共享侦听器。
  • Azure 上不支持 UDP 多播。

使用 UdpBinding 进行多播演示

什么是多播?多播是用于描述信息从一个或多个点发送到另一组点的通信的术语。在多播中,发送方 >= 1(即,至少要有一个发送方)和接收方 >= 0(即,可能没有接收方)。

对于此演示,我将使用单向消息创建一个简单的股票行情应用程序。我已定义了服务合同和数据合同,如下所示:

[ServiceContract]
public interface IStockService
{
    [OperationContract(IsOneWay = true)]
    void SendStockDetail(Stock stock);
}

[DataContract]
public class Stock
{
    [DataMember]
    public string Name;

    [DataMember]
    public double Price;
}

然后,我已实现 IStockService 服务合同,以创建如下所示的 StockService 服务:

public class StockService : IStockService
{
    public void SendStockDetail(Stock stock)
    {
        Console.WriteLine(string.Format("Stock Name: {0}, Price: ${1}", stock.Name, stock.Price));
    }
}

现在,每个想要接收多播消息的客户端(接收方)必须通过 app.config 文件托管 StockService 服务,公开 IStockService 接口。对于此演示,我创建了一个控制台应用程序来托管 StockService(接收方),并通过 app.config 文件公开了 UDP 端点,如下所示:

<endpoint address="udp" binding="udpBinding" contract="StockServiceLibrary.IStockService" />
<host>
    <baseAddresses>
       <add baseaddress="soap.udp://224.1.1.1:40000/StockService">
    </baseAddresses>

请注意,我在上面的服务基址中使用了多播地址:224.1.1.1:4000。需要注意的是,多播地址必须在 224.0.0.0 到 239.255.255.255 的范围内。此地址范围在 IPv4 的上下文中指的是D 类。此范围内的所有地址都以二进制模式 1110 开头。此范围内的地址保留用于特殊用途。因此,在此范围内的自由使用是有限的。

最后,我创建了一个控制台客户端应用程序,它将充当此演示的发送方。此客户端应用程序(发送方)将实际发送多播消息,并且每个服务实例(接收方)将通过侦听正确的 UDP 地址来接收多播消息。我通过使用 Random 类动态生成股票名称及其价格来模拟多播以发送多播股票信息。以下是客户端应用程序代码:

var cf = new ChannelFactory<IStockService>("UdpBinding_IStockService");
var channel = cf.CreateChannel();

Console.WriteLine("*** One-Way Multicast Demo using UdpBinding ***\n");
Console.WriteLine("Please any key to start multicasting ...");
string command = Console.ReadLine();

    while (true)
    {
        var stock = GetStockDetails();
        channel.SendStockDetail(stock);

        Console.WriteLine("Details of the Stock: {0} has been sent.", stock.Name);
        System.Threading.Thread.Sleep(3000);
    }

((IClientChannel)channel).Close();

GetStockDetails 方法动态生成股票信息,然后使用 IStockService 服务合同将消息发送到侦听正确 UDP 地址的接收方服务。

要运行此演示,请首先将 Host 项目设置为启动项目,然后通过多次按 Ctrl+F5 来启动多个服务实例。然后,将 Client 项目设置为启动项目,然后再次按 Ctrl+F5 来启动 Client 项目。最后,在 Client(发送方)控制台上按任意键开始多播。您将看到所有接收方都收到发送方发送的消息,前提是它们未丢失。

现在,只需停止其中一个接收方,您就会发现发送方正在向可用的接收方(正在运行)发送多播消息,而没有任何问题。

接下来停止所有接收方,您会发现发送方仍在发送多播消息,即使没有接收方。为什么?因为在多播中,可能没有接收方。

最后,您可以启动多个服务实例(接收方)以及多个客户端实例(发送方),您会注意到所有接收方都会收到来自每个发送方的消息,前提是它们未丢失。为什么?因为在多播中,可能有一个以上的发送方。

结论

因此,我在这里展示了如何在 WCF 4.5 中使用 UdpBinding 和单向消息来实现多播。请告诉我您的反馈和建议。祝您编码愉快。

© . All rights reserved.