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

WCF 4.5 的新特性?UDP 传输支持

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2012年2月17日

CPOL

3分钟阅读

viewsIcon

35482

这是 WCF 4.5 系列的第十篇博文。

这是 WCF 4.5 系列的第十篇博文。我从 4 个月前 .NET 4.5 开发者预览版发布时开始了这个系列的文章; Beta/RC/RTM 版本即将推出,希望它能尽快可用,并且你可以在你的项目中使用新的 WCF 4.5 功能。

到目前为止,我已经展示了配置简易性和宿主改进方面的新功能。在这篇文章和下一篇文章中,我将介绍新的传输功能,从支持 UDP 传输开始。

之前的文章

  1. WCF 4.5 有什么新内容?让我们从 WCF 配置开始
  2. WCF 4.5 有什么新内容?单个 WSDL 文件
  3. WCF 4.5 有什么新内容?配置文件中的工具提示和智能感知
  4. WCF 4.5 有什么新内容?配置验证
  5. WCF 4.5 有什么新内容?IIS 中单个端点支持多种身份验证
  6. WCF 4.5 有什么新内容?IIS 的自动 HTTPS 端点
  7. WCF 4.5 中的新功能? BasicHttpsBinding
  8. WCF 4.5 的新特性?ASP.NET 兼容模式的默认值已更改
  9. WCF 4.5 的新特性?改进了 IIS 宿主中的流式传输

我已经教授 WCF 多年了,几乎每次我向人们解释不同类型的绑定和支持的传输时,都会有人问我是否内置了对 UDP 传输的支持。到目前为止,我的回答是“它不提供开箱即用的支持,但在 WCF/WF 示例中有一个 UDP 传输示例”。从现在开始,我的新答案是“在 WCF 4/3.5 中有一个示例实现,但它现在在 WCF 4.5 中是开箱即用的”。

你可以在 MSDN 上的 系统提供的绑定页面上获得关于该绑定的一些基本信息(确保你查看的是 4.5 版本),遗憾的是,目前还没有关于 UdpBinding 类型的文档,但希望微软会在 WCF 4.5 发布时创建它。

声明使用 UDP 的终结点非常简单

<endpoint address="soap.udp://:8080/" 
    binding="udpBinding" contract="UdpHost.IService" />

关于新的 UDP 绑定的一些事实

  1. 此绑定的地址方案为 soap.udp://
  2. 该绑定不可互操作(毫不奇怪……)
  3. 不支持安全性(传输或消息都不支持)
  4. 不支持会话、事务、流式传输和双工(我希望有一个使用单向消息的双工 UDP)
  5. 支持的编码是文本
  6. 可以通过添加对 System.ServiceModel.Channels 程序集的引用,在代码中使用该绑定
  7. IIS/WAS 不支持该绑定,因为 WAS 仍然没有 UDP 共享侦听器
  8. 在单向消息的情况下,这是一个真正的单向单向调用 - 如果服务不可用,客户端不会抛出异常
  9. 如果在终结点中指定一个 多播地址,例如 224.0.0.1 或 239.255.255.255(后者被 UDP 发现终结点使用),你可以在相同的地址+协议上创建多个侦听器,即使来自不同的机器 - 一个客户端可以发送一条消息,该消息将被多个侦听器接收 - 这可以成为同步服务器状态、执行发布-订阅(通知)调用等的绝佳方式...

使用多播侦听地址也很简单

<endpoint address="soap.udp://239.255.255.255:8083/" 
    binding="udpBinding" contract="UdpHost.IService" />

至于性能,我创建了一个简单的客户端,它使用请求-响应和单向(简单和多播)发送 5000 条消息,并使用 HTTP (basicHttp)、TCP 和 UDP 绑定。 为了测试的目的,我从 NetTcp 绑定中删除了所有的安全设置。 结果如下所示

Calling 5000 iterations one way using UDP 
One-way using UDP took 0 seconds, average is 0.1792ms

Calling 5000 iterations one way using HTTP 
One-way using HTTP took 6 seconds, average is 1.3ms

Calling 5000 iterations one way using TCP 
One-way using TCP took 2 seconds, average is 0.5876ms

Calling 5000 iterations one way using UDP Multicast 
One-way using UDP Multicast took 3 seconds, average is 0.736ms

Calling 5000 iterations of request-response using UDP 
Request-response using UDP took 7 seconds, average is 1.4738ms

Calling 5000 iterations of request-response using HTTP 
Request-response using HTTP took 8 seconds, average is 1.7784ms

Calling 5000 iterations of request-response using TCP 
Request-response using TCP took 4 seconds, average is 0.9518ms

结论

  1. 使用 UDP 时,单向消息的速度很快 - 比 HTTP 快约 7 倍,比 TCP 快约 3 倍。 我假设这是因为在使用 UDP 时,我们不需要等待 TCP ACK(HTTP 中也使用)。
  2. UDP 中的单向多播消息比直接消息慢 - 慢约 4 倍。
  3. UDP 中的请求-响应消息比 TCP 慢,但比 HTTP 快。 我假设比 TCP 慢的原因是 UDP 使用两个通道来创建请求-响应,而 TCP 只需要一个通道。

当服务器尚未启动时,尝试运行相同的示例会产生以下结果

Calling 5000 iterations one way using UDP 
One-way using UDP took 0 seconds, average is 0.1216ms

Calling 5000 iterations one way using HTTP 
One-way using HTTP failed

Calling 5000 iterations one way using TCP 
One-way using TCP failed

Calling 5000 iterations one way using UDP Multicast 
One-way using UDP Multicast took 1 seconds, average is 0.376ms

Calling 5000 iterations of request-response using UDP 
Request-response using UDP failed

Calling 5000 iterations of request-response using HTTP 
Request-response using HTTP failed

Calling 5000 iterations of request-response using TCP 
Request-response using TCP failed

正如你所看到的,UDP 单向消息是单向的!!!

示例代码可在我的 SkyDrive 上获得。

© . All rights reserved.