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





5.00/5 (6投票s)
这是 WCF 4.5 系列的第十篇博文。
这是 WCF 4.5 系列的第十篇博文。我从 4 个月前 .NET 4.5 开发者预览版发布时开始了这个系列的文章; Beta/RC/RTM 版本即将推出,希望它能尽快可用,并且你可以在你的项目中使用新的 WCF 4.5 功能。
到目前为止,我已经展示了配置简易性和宿主改进方面的新功能。在这篇文章和下一篇文章中,我将介绍新的传输功能,从支持 UDP 传输开始。
之前的文章
- WCF 4.5 有什么新内容?让我们从 WCF 配置开始
- WCF 4.5 有什么新内容?单个 WSDL 文件
- WCF 4.5 有什么新内容?配置文件中的工具提示和智能感知
- WCF 4.5 有什么新内容?配置验证
- WCF 4.5 有什么新内容?IIS 中单个端点支持多种身份验证
- WCF 4.5 有什么新内容?IIS 的自动 HTTPS 端点
- WCF 4.5 中的新功能? BasicHttpsBinding
- WCF 4.5 的新特性?ASP.NET 兼容模式的默认值已更改
- 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 绑定的一些事实
- 此绑定的地址方案为
soap.udp://
- 该绑定不可互操作(毫不奇怪……)
- 不支持安全性(传输或消息都不支持)
- 不支持会话、事务、流式传输和双工(我希望有一个使用单向消息的双工 UDP)
- 支持的编码是文本
- 可以通过添加对
System.ServiceModel.Channels
程序集的引用,在代码中使用该绑定 - IIS/WAS 不支持该绑定,因为 WAS 仍然没有 UDP 共享侦听器
- 在单向消息的情况下,这是一个真正的单向单向调用 - 如果服务不可用,客户端不会抛出异常
- 如果在终结点中指定一个 多播地址,例如 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
结论
- 使用 UDP 时,单向消息的速度很快 - 比 HTTP 快约 7 倍,比 TCP 快约 3 倍。 我假设这是因为在使用 UDP 时,我们不需要等待 TCP ACK(HTTP 中也使用)。
- UDP 中的单向多播消息比直接消息慢 - 慢约 4 倍。
- 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 上获得。