WCF 绑定 - 太多了!我该如何选择?

Posted

技术标签:

【中文标题】WCF 绑定 - 太多了!我该如何选择?【英文标题】:WCF Bindings - so many! How do I choose one? 【发布时间】:2010-09-19 06:19:17 【问题描述】:

我们有一个R Server (R 是一种用于统计分析的编程语言)基本上采用脚本和 csv 文件,处理一些数据并以文本形式返回结果。

我需要在 R 服务器上编写一个服务,以便 .net 客户端(可以是 .Net Windows Forms 或 ASP.Net)可以连接到 R 服务器,提交脚本和 CSV 文件,然后返回结果.

我对可用的许多不同绑定感到困惑,并且网络上的信息似乎很少/分散关于选择哪个绑定。

另外,最好在 IIS 中运行该服务,还是作为单独的“命令行”类型的侦听器服务(后者与 IIS 相比看起来很难看,我不知道为什么有人会选择这样做,如果他们可以运行它在 IIS 中)?

【问题讨论】:

【参考方案1】:

就个人而言,我会推荐最简单的绑定,以满足您的需求。我已经完成了很多 WCF(有些非常复杂),而且我从来没有使用过 BasicHttpBinding 以外的任何东西;这还可以最大程度地兼容非 .NET 客户端,并允许您使用 MTOM 等工具进行高效的二进制传输。

重新托管; IIS 确实是最简单的客户端/服务器设置;两个特别的优势:

易于配置 SSL(即您只需配置 IIS,WCF 就会使用它) 易于负载平衡(只需对您的网络场进行负载平衡)

(我相信在 BasicHttpProfile 上运行的 WCF 也可以利用您的 IIS 压缩 [GZip/Deflate] 设置,但不要引用我的话......)

如果(例如)您想要一个长时间运行的有状态服务器,您可以选择使用独立主机(通常通过 Windows 服务)。 IIS 有这种回收应用程序池的习惯(通过设计),如果您将某些内容保存在内存中,那就不好了!另一个例子是您希望它已经运行以获得快速的“首次命中”性能(而不是等待 IIS/ASP.NET 启动)。涵盖这两种情况的示例可能是托管 WF(工作流)服务器。

再次;如果您不需要这种复杂性,请选择最简单的选项:在 IIS 中托管。

【讨论】:

有趣。对于 .NET 到 .NET,我知道我不关心与非 .NET 客户端的兼容性,我通常使用 TCP 绑定,根据流程图这似乎是正确的。 weblogs.asp.net/spano/archive/2007/10/02/…。你的建议当然是最简单的,但如果你有一本好书/例子/知道你在做什么,让其他绑定工作并不多。我认为现在 Windows Process Activation Service (WAS) 出现时,选择 IIS 的理由较弱。【参考方案2】:

确实有很多选择。

绑定

WCF 提供的绑定是一组用于常见场景的协议。它指定传输、消息和安全信息。

在选择绑定时,您需要从其中找出您需要的功能。 例如你可能需要一种方法来

验证客户端,因为您不希望每个人都能使用您的服务。 数据可能需要加密。 该服务需要能够与来自其他平台的客户端互操作。 消息的开销正在成为一个问题。

如果您知道客户端始终来自 dot net,则可以使用 net tcp 绑定,这比 basicHttpbinding 更快。但是,basicHttpBinding 是一个可互操作的协议,即使是 php 或 java 客户端也可以毫无问题地与之通信。

定义你自己对服务的要求,然后寻找现有的绑定来满足你的需求,如果没有任何现有的绑定,你可以创建自己的绑定,称为自定义绑定,它可以结合来自不同绑定的特性共同实现目标。

托管

IIS 更具可扩展性。如果您的服务不需要必须在长期运行的守护进程(Windows 服务或控制台应用程序)中托管的状态,则选择 IIS,因为它很容易为您的服务启用压缩和加密。

关于绑定的更多信息

如果您希望在浏览器中调用您的服务,即 javascript WebHttpBinding 是 dot net 为您定义的好工具。您可以利用 enbableWebScript 使服务理解 JavaScript 的 JSON。

可用性

如果一个特定的绑定不能满足所有要求,您可以在不同的端点以不同的绑定公开每个服务。例如主机/soap 主机/nettcp 主机/json

【讨论】:

【参考方案3】:

我建议参考 Juval Lowy 的《Programming WCF Services》一书。

他浏览了一个决策图表,以帮助您决定使用哪种绑定。你也可以在这里找到他关于绑定的文章

http://www.code-magazine.com/article.aspx?quickid=0605051&page=3

【讨论】:

是的——流程图很方便。 这本书也是如此——虽然不适合初学者【参考方案4】:

从 wros 的 WCF4 一书中摘录“所有这些内置绑定都建立在适用于特定场景的标准之上,但如果您选择了错误或效率较低的标准,也可以使用。那么您如何选择哪一个是适合你吗?

如果您需要与非 WCF 应用程序交互,这是最明显的决定。如果您的服务要与 WCF 客户端通信,那么您可以使用以“net”为前缀的绑定。请记住,您可以为使用不同绑定的同一服务定义多个端点。这允许您利用 WCF 客户端的性能优化,但仍提供对 ASMX 服务和 WS-* 标准的支持。这些提供了更多的安全性和其他许多客户利用的功能。

例如,如果要建立 WCF 到 WCF 通信,选择二进制编码的 NetTcpBinding 比使用文本编码的 BasicHttpBinding 快四到五倍。

这些 WCF 提供的绑定应该涵盖您需要的大多数情况:但是,如果您需要更改或创建一个完全新的绑定,WCF 允许您非常简单地做到这一点"

【讨论】:

以上是关于WCF 绑定 - 太多了!我该如何选择?的主要内容,如果未能解决你的问题,请参考以下文章

WCF技术我们应该如何以正确的方式去学习掌握

WCF技术我们应该如何以正确的方式去学习掌握

WCF - 如何获取一些频道标识符?

CxGrid用法汇总

如何选择条件复杂的数据?

自承载 WCF 服务错误