【问题标题】:Does WCF raise the bar or just the complexity level? [closed]WCF 是提高标准还是仅仅提高了复杂性水平? [关闭]
【发布时间】:2010-09-08 04:26:29
【问题描述】:

我了解 WCF 提供的三部分服务/主机/客户端模型的价值。但它只是我还是看起来像 WCF 采取了一些非常直接和直接的东西(ASMX 模型)并把它弄得一团糟?

是否有替代使用 SvcUtil 的命令行回退来生成代理的替代方法?使用 ASMX 服务会自动提供测试工具;今天有 WCF 的好选择吗?

我很欣赏 WS* 的东西与 WCF 更紧密地集成在一起,并希望在那里为 WCF 找到一些回报,但是天哪,否则我会感到困惑。

此外,可用于 WCF 的书籍的状态充其量也很糟糕。 Juval Lowy 是一位出色的作者,他写了一本很好的 O'Reilly 参考书“Programming WCF Services”,但它对于现在学习使用 WCF 并没有多大作用(无论如何对我来说)。这本书的前身(作为教程组织得更好,但不多)是 Michele Leroux Bustamante 的 Learning WCF。它有很好的地方,但已经过时了,相应的网站也不见了。

除了继续用谷歌搜索bejebus之外,你还有很好的WCF学习参考吗?

【问题讨论】:

标签: wcf web-services


【解决方案1】:

好的,我们开始吧。首先,Michele Leroux Bustamante 的书已针对 VS2008 进行了更新。这本书的网站没有消失。它现在就启动了,它有很多很棒的 WCF 信息。在那个网站上,她为她书中的所有示例提供了与 VS2008 兼容的更新代码。如果您从亚马逊订购,您将获得更新的转载。

WCF 不仅仅是 ASMX 的替代品。当然它可以(并且做得很好)取代 ASMX,但真正的好处是它允许您的服务是自托管的。 WSE 的大部分功能从一开始就已经融入其中。该框架是高度可配置的,并且通过多种协议为多个端点提供服务的能力令人惊叹,IMO。

虽然您仍然可以从“添加服务引用”选项生成代理类,但这不是必需的。您真正需要做的就是复制您的 ServiceContract 接口并告诉您的代码在哪里可以找到服务的端点,仅此而已。您可以使用很少的代码从服务中调用方法。使用此方法,您可以完全控制实施。无论您选择哪种方法来生成代理类,Michele 在她关于该主题的优秀 系列网络广播中都展示并使用了这两种方法。

Michele 有很多很棒的资料,我建议您查看她的网站。在我学习 WCF 时,这里有一些对我非常有帮助的链接。我希望您会意识到 WCF 的真正强大之处,以及实现它的难易程度。学习曲线有点陡峭,但您的时间投入所带来的回报非常值得:

我建议您至少观看 1 个 Michele 的网络广播。她是一位非常有效率的演讲者,而且她在 WCF 方面的知识显然令人难以置信。她在从头开始揭开 WCF 内部运作的神秘面纱方面做得很好。

【讨论】:

  • 很棒的资源。我不会说 rp 是在抨击 WCF 或作者。在 ASMX 花了这么多时间之后,我在尝试查看 WCF 时也感到有点不知所措。我知道它更好,我想体验它,但很难找到像使用 ASMX 那样的切入点。
【解决方案2】:

【讨论】:

【解决方案3】:

我很难确定何时应该或应该使用 WCF。为什么?因为我把生产力和简单性放在我的清单上。为什么 ASMX 模型如此成功,因为它有效,而且您可以让它快速运作。在 VS 2005 和 .NET 2.0 中,wsdl.exe 提供了相当不错且合规的服务。

在现实生活中,您的架构中应该只有很少的通信协议。这使它保持简单和可维护。如果您需要访问遗留系统,请为它们编写特定的适配器,这样它们就可以在闪亮而美丽的 SOA 世界中发挥作用。

【讨论】:

  • WCF 旨在成为所有这些协议的单一框架。它处理 SOAP、REST 和 WSCF 适配器 SDK,它也处理那些“遗留系统”连接,所有这些都在 WCF 模型中。
  • 这取决于您如何衡量“生产力”。我宁愿开发人员现在花 2 到 3 天时间来解决这个问题,因为好处是在 6 个月的时间内。 WCF 取代的不仅仅是 Web 服务。
  • 我同意 100%。如果您只想要 Web 服务并且需要快速发布(谁不想要?),它的 ASMX 一路宝贝! WCF 是一个巨大的大锤——如果你想要的只是基本的 Web 服务,那就太矫枉过正了。仅仅因为它是闪亮的新事物并不意味着您应该在所有情况下始终假设它的全面性更好。并且仅仅因为 WCF 很难理解,并不能使您成为选择它的聪明人。为那些有胆量拒绝加入 WCF 潮流的人提供更多权力!
【解决方案4】:

WCF 比 ASMX 强大得多,它以多种方式对其进行了扩展。 ASMX 仅限于 HTTP,而 WCF 可以使用多种协议进行通信(当然,HTTP 仍然是大多数人使用它的方式,至少对于需要互操作的服务而言)。 WCF 也更容易扩展。至少,可以以 ASMX 无法扩展的方式对其进行扩展。 “容易”可能会拉伸它。 =)

在我看来,WCF 提供的附加功能远远超过了它所增加的复杂性。我也觉得编程模型更容易。例如,DataContracts 比必须使用带有公共属性的 XML 序列化来进行序列化要好得多。它在本质上也更具声明性,这也很好。

【讨论】:

    【解决方案5】:

    等等....你有没有使用过 .NET Remoting,因为那是它所取代的真实东西。 .NET Remoting 本身就相当复杂。我发现 WCF 更简单,布局也更好。

    【讨论】:

      【解决方案6】:

      我没有看到它经常被提及,但是您可以仍然使用 WCF 实现相当简单的服务,与 ASMX 服务非常相似。例如:

      [ServiceContract]
      [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
      public class SimpleService
      {
          [OperationContract]
          public string HelloWorld()
          {
              return "Hello World";
          }
      
      }
      

      您仍然需要在 web.config 中注册端点,但这还不错。

      消除分离的数据、服务和操作合同的冗长对于使 WCF 对我来说更易于管理大有帮助。

      【讨论】:

      • AspNetCompatibilityRequirements 是一个必要的邪恶,如果许多开发人员打算从他们目前运行良好的 ASMX 服务进行切换。
      • @dan 为什么不 AspNetCompatibilityRequirements
      • @DaveWard AspNetCompatibilityRequirements 是必要的邪恶 ?
      【解决方案7】:

      VS2008 包含“添加服务引用”上下文菜单项,它将在幕后为您创建代理。

      如前所述,WCF 不仅仅旨在替代 ASMX Web 服务类型,而是为所有可互操作的服务(无论是通过 HTTP、tcp、命名管道还是 MSMQ)提供一致、安全和可扩展的方法运输。

      我承认我在 WCF 方面确实存在其他问题(例如,在通过 basicHTTP 公开服务时重写方法签名 - 请参阅 here,但总的来说,我认为这是一个明确的改进

      【讨论】:

        【解决方案8】:

        如果您使用 VS2008 并创建 WCF 项目,那么当您点击运行/调试时,您会自动获得一个测试工具,并且您可以添加引用而无需使用 svcutil。

        【讨论】:

          【解决方案9】:

          我最初对 WCF 的想法是完全一样的!以下是一些解决方案:

          1. 利用泛型编写您自己的代理/客户端层(参见类ClientBase,绑定)。我发现这很容易开始工作,但很难完美。
          2. 使用 1 的第三方实现(SoftwareIsHardwork 是我目前最喜欢的)

          【讨论】:

            【解决方案10】:

            WCF 是 Microsoft 早期所有 Web 服务 技术的替代品。它的功能也远远超过传统意义上的“网络服务”。

            WCF“Web 服务”是通过 WCF 实现的更广泛远程通信的一部分。您将在 WCF 中获得比通过传统 ASMX 更高程度的灵活性和可移植性,因为 WCF 从头开始​​设计,总结了 Microsoft 提供的所有不同的分布式编程基础结构。 WCF 中的端点可以通过 SOAP/XML 与通过 TCP/二进制文件进行通信一样容易,并且更改此介质只需一个配置文件 mod。理论上,这可以减少移植或更改业务需求、目标等时所需的新代码量。

            ASMX is older than WCF, and anything ASMX can do so can WCF (and more)。基本上,您可以将 WCF 视为试图将在 Microsoft 世界中让两个应用程序进行通信的所有不同方式逻辑地组合在一起; ASMX 只是众多方式中的一种,因此现在归入 WCF 功能的保护伞下。

            Web 服务只能通过 HTTP 访问,它可以在无状态环境中工作,其中 WCF 很灵活,因为它的服务可以托管在不同类型的应用程序中。托管 WCF 服务的常见方案是 IIS、WAS、自托管、托管 Windows 服务。

            主要区别在于 Web 服务使用 XmlSerializer。但是 WCF 使用 DataContractSerializer,与 XmlSerializer 相比性能更好。

            在什么情况下必须使用 WCF

            • 一种用于处理业务交易的安全服务。一项服务
            • 向其他人提供当前数据,例如交通报告或其他
            • 监控服务。允许两个人聊天的服务
            • 实时通信或交换数据。仪表板应用程序
            • 轮询一项或多项服务以获取数据并以逻辑形式呈现
            • 演示文稿。公开使用 Windows Workflow 实现的工作流
            • 作为 WCF 服务的基础。用于轮询的 Silverlight 应用程序
            • 最新数据馈送服务。

            WCF 的特点

            • 服务导向
            • 互操作性
            • 多种消息模式
            • 服务元数据
            • 数据合同
            • 安全性
            • 多种传输和编码
            • 可靠和排队的消息
            • 持久消息
            • 交易
            • AJAX 和 REST 支持
            • 可扩展性

            来源:main source of text

            【讨论】:

            • 现在,使用 WCF 还是 REST?还是 WebAPI?还是微服务?
            【解决方案11】:

            MSDN?我通常在图书馆参考本身方面做得很好,我通常希望在那里找到有价值的文章。

            【讨论】:

              【解决方案12】:

              就它提供的功能而言,我认为答案是兼容性。 ASMX 服务非常微软化。并不是说他们没有尝试与其他消费者兼容;但除了 ASP.NET 网页和其他一些自定义 Microsoft 消费者之外,该模型并不能很好地适应。而 WCF,由于其架构,允许您的服务具有非常开放的基于标准的端点,例如除了通常的 SOAP 之外,还有 REST、JSON 等。与您的 ASMX 服务相比,其他人使用您的 WCF 服务可能更容易。

              (这基本上都是从比较MSDN阅读中推断出来的,所以知道更多的人应该随时纠正我。)

              【讨论】:

              • 我对跨平台 ASMX 服务没有任何问题——XML 在那里做得很好。我了解 WCF = 远程处理 + ASMX + MSMQ + WSE。我的牛肉是 MS 应该使用一点“渐进式增强”来使 WCF 更容易接近,我的问题是如何!谢谢,rp
              • ASMX 互操作性非常好,尽管涉及 WS-Security 时工作量更大。
              【解决方案13】:

              不应将 WCF 视为 ASMX 的替代品。从它的定位和微软内部使用情况来看,它确实是一个基础架构,可用于任何类型的跨界通信。

              【讨论】:

              • 是的...作为一个基本的通信框架,它应该取代 ASMX 和面向 ASP.NET 的 Web 服务。没有?
              【解决方案14】:

              我相信 WCF 在很多方面确实推动了 ASMX Web 服务的实现。首先,它提供了一个非常好的分层对象模型,有助于隐藏分布式应用程序的内在复杂性。 其次,您可以拥有更多的请求-重放消息模式,包括从服务器到客户端的异步通知(纯 HTTP 不可能),第三,从 XML 消息中抽象出底层传输协议,从而优雅地支持 HTTP、HTTPS、TCP 等。与“第一代”Web 服务的向后兼容性也是一个优势。 WCF 使用 XML 标准作为内部表示格式。这可能被视为优势或劣势,尤其是在 JSON 等“XML 的无脂肪替代品”日益流行的情况下。

              【讨论】:

                【解决方案15】:

                我发现使用 WCF 的困难在于管理客户端和服务器的配置,以及对不太好的故障状态异常进行故障排除。

                如果有人有任何捷径或提示,那就太好了。

                【讨论】:

                  【解决方案16】:

                  我觉得那很痛苦;因为我在两端都有.NET,在两端都加载了相同的“合同”dll,等等。但是我不得不处理很多细节,比如“KnownType”属性。

                  WCF 还默认只允许 1 或 2 个客户端连接到服务,直到您更改大量配置。从代码更改配置并不容易,发送大量配置文件不是一种选择,因为很难将我们的更改合并到客户在升级时可能所做的任何更改中(我们也不希望客户使用 WCF 设置!)

                  .NET 远程处理在大多数情况下都可以正常工作。

                  我认为试图假装认为 .NET 到 .NET 基于对象的通信与将文本 (xml) 位发送到未知系统是一样的,这太过分了。

                  (我们几次使用 WCF 与 Java 系统对话,我们发现 Java 系统给出的 XSD 与它想要的 XML 不匹配,因此不得不手动编写大量 XML 映射.)

                  【讨论】:

                  • 当人们说 WCF 是远程处理的替代品时,我认为他们有点离题了。当您想要进行真正的 .Net 到 .Net 基于对象的调用时,远程处理仍然是一个不错的选择,并且可以充分控制两端的设置方式。另一方面,WCF 旨在为 任何人 以他们想要的任何方式发布服务。
                  • @Tim,微软现在说所有事情都使用 WCF,它是远程处理的替代品。远程处理似乎是 .net 世界被遗忘的孩子。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-08-21
                  • 2013-08-01
                  • 1970-01-01
                  • 2018-08-19
                  • 2017-01-17
                  相关资源
                  最近更新 更多