【问题标题】:Which to use...REST, ASMX, WSE or WCF?使用哪个...REST、ASMX、WSE 或 WCF?
【发布时间】:2009-06-01 23:53:48
【问题描述】:

我有一个执行特定功能的 Windows 服务,然后需要将该信息发送到 Web 服务进行处理。 Web 服务由远程 Web 应用程序托管。我正在尝试确定调用 Web 服务的最佳方式,因为每个 Web 应用程序可能只有 2.0 或 3.5 等。在我的 Windows 服务中,我在 app.config 中定义每个“客户端”,例如

<Client WebServiceUrl="http://location.com/webservice.svc" Username="" Password="">

</Client>

Web 应用程序必须实现我的 Windows 服务运行所需的两个 Web 服务,但不确定为 Web 应用程序实现“规则”的最佳方式。

编辑:

我会尝试改写.. Windows 服务每 30 秒运行一次并获取信息列表。该服务支持多个“客户端”,如上所示。当每个客户端进程运行时,都会收集数据,然后需要将其发送到支持的 Web 应用程序。

windows 服务不知道如何处理数据,它只是发送它。客户端的每个 Web 应用程序将位于不同的位置,并且可能使用 2.0、3.5、PHP 等构建。所有 windows 服务关心的是,当它为客户端执行处理时,它能够发送数据到在 windows 服务的 app.config 中定义的 web 服务位置。

我要确定的是如何连接到 web 服务(我倾向于 WCF,但基本或 WS 不确定),以及在如何构建 web 应用程序时需要定义哪些规则回复。

如果 Windows 服务要支持 php 应用程序等,WSHttpBinding 将不是一个选项,这意味着 BasicHttpBinding 将起作用。要决定的另一件事是是否使用 RESTful 服务或 SOAP 服务。

希望这更有意义。

【问题讨论】:

  • 恐怕我不太明白这个问题。您对 2.0、3.5 等的引用是否高于对 .NET Framework 版本的引用?您是说您的 Windows 服务可能必须调用各种不同的 Web 应用程序,每个应用程序都以不同的方式实现?还是您正在实施 Web 服务并试图找出最佳方法?
  • 是的,米奇也许你可以重述这个问题,因为我也不清楚。
  • 好吧,当您说“客户”时,您的真正意思是“付费客户”,事实上,“客户”就是我们在分布式系统设计中所说的“服务器”。
  • 当你说“当每个客户端进程运行时......”是什么意思。我以为 Windows 服务刚刚运行 - 它收集与客户/客户无关的数据。然后它将数据发送给客户/客户。运行客户端进程是什么意思?
  • 假设我有两个进程,一个将数字相加,另一个将数字相减(作为一个小例子)。两者都在 Windows 服务中,并且配置中定义的每个客户端(付费客户)都使用这些进程。每个客户端初始化一个新线程来运行这些进程。这些进程每 x 秒运行一次,当进程完成时,将结果发送到配置中定义的 Web 服务。

标签: wcf web-services


【解决方案1】:

我不太清楚你在做什么。

您似乎拥有 3 个东西:一个 Windows 服务,然后是一个托管在 Web 应用程序中的 Web 服务。
我认为您的问题是,在将 Windows 服务应用程序与远程 Web 服务互连时使用什么,REST、ASMX、WSE 或 WCF

ASMX、WSE 和 WCF 是 Web 服务的替代编程模型。 REST 不是一种编程模型。它不像其他三个。

ASMX 和 WSE 将要求您使用 Web 服务和 SOAP。
WCF 可以允许您使用 Web 服务和 SOAP、基于 HTTP 的 REST(XML 或 JSON)或基于 TCP 的二进制格式,以及其他选项。

因为它是灵活且最新的技术,所以我推荐 WCF。 ASMX 现在被 Microsoft 称为“遗留技术”。并不意味着它不会工作,但它不会得到更新。 (很像 WinForms 与 WPF)。据我所知,WSE 不再受到主流支持。由于这些原因,我不建议在 WSE 或 ASMX 上启动新项目。


WCF 比 ASMX 更通用,因此看起来也更复杂。但是,一旦您做出一些选择并将您想要的东西归零(例如选择 HTTP 和 REST,或者选择二进制和 TCP),它就会更加强大。 WCF 可以用作客户端或发送方(在您的情况下,我猜是 Windows 服务)和/或服务器(托管在 Web 应用程序中的 Web 服务)上的编程模型。

在客户端使用 WCF 并不意味着您必须在服务器端使用它,反之亦然。另一方面,如果您控制两端的源代码,我建议在两端都使用 WCF。

至于“如何实施网络应用程序的规则” - 我不明白你在问什么。如果您对那里的问题更具体,也许有人可以提供帮助。


更新:根据您的补充说明,我建议您查看 WCF 中用于 .NET 3.5 的 REST 内容。在 PHP 中实现 REST 样式的服务非常容易,而使用 WCF,对于 .NET 也是如此。现在,在您的情况下,Windows 服务是 client,它正在向驻留在客户网络上的各种 服务器 发送请求(更新请求)。根据 REST 原则,我会根据调用的语义将这些出站请求设为 PUT 或 POST。

然后,您可以将一些示例服务代码发送给您的(大写)客户端,让他们开始构建接收您的出站 PUT/POST 消息所需的内容。

不过,安全性是一个问题。你根本没有提到它,这令人惊讶。安全性不是最好推迟的事情之一,因此您“稍后再添加”。您应该尽早考虑它 - 它可能会影响您所做的协议选择。例如,如果您需要相互验证客户端和服务器(后者在您的“大写”客户端网络中),那么您可能想要使用 SOAP,它在协议方面为您提供了很好的安全选项。 WCF 很好地支持安全 Web 服务扩展(WS-Sec 等),但不确定 PHP 中此功能的状态。

【讨论】:

  • +1 推荐 WCF 而不是 ASMX/WSE - 今天开始一个新项目时,如果有更强大和更灵活的继任者可用,那么使用 ASMX 和 WSE 等过时技术是没有意义的!
  • 虽然我在最初的解释中没有提到安全性,但肯定会考虑到这一点,因为发送的信息是敏感的。根据研究和其他帖子,我们必须对付费客户如何实施其网络服务设定最低要求。身份验证是必须的。
  • 我同意marc_s,从WSE转到WCF后,我再也不会回去了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
相关资源
最近更新 更多