代码之家  ›  专栏  ›  技术社区  ›  rp.

WCF:WTF!WCF是提高了标准还是仅仅提高了复杂性?

  •  85
  • rp.  · 技术社区  · 16 年前

    我了解WCF提供的三部分服务/主机/客户机模型的价值。但这仅仅是我一个人吗,还是看起来WCF采取了一些非常直接和直接的方式(ASMX模型)并把它搞得一团糟?

    是否有其他方法可以使用svcutil的命令行“及时后退”来生成代理?对于asmx服务,自动提供了一个测试工具;现在有没有一个好的wcf替代方案?

    我很感激WS*的东西与WCF更紧密地结合在一起,并且希望在那里找到一些WCF的回报,但是Geeze,否则我很困惑。

    此外,世界自然基金会可用图书的状况充其量也很糟糕。JuvalLowy是一位优秀的作家,他写了一本很好的O'Reilly参考书“编程WCF服务”,但对于我来说,现在学习使用WCF并没有那么多帮助。这本书的前身是米歇尔·勒鲁克斯·布斯塔曼特(MicheleLerouxBustamante)的《学习WCF》(LearningWCF)。它有好的地方,但已经过时了,相应的网站也不见了。

    你有没有良好的WCF学习参考,除了继续谷歌的贝杰布斯出的东西?

    谢谢, RP

    16 回复  |  直到 10 年前
        1
  •  61
  •   Scott Arrington    15 年前

    好的,我们开始吧。首先,Michele Leroux Bustamante的书已经为VS2008进行了更新。这本书的网站还没有消失。它现在就在上面,它有很多很棒的WCF信息。在该网站上,她为书中的所有示例提供了与VS2008兼容的更新代码。如果你从亚马逊订购,你会得到更新的再版。

    WCF不是 只有 ASMX的替代品。当然,它可以(并且做得很好)取代ASMX,但真正的好处是它允许您的服务自托管。WSE的大部分功能都是从一开始就已经实现的。框架是 高度地 可配置,并且能够在多个协议上为多个端点提供服务,这是令人惊讶的,IMO。

    虽然您仍然可以从“添加服务引用”选项生成代理类,但这不是必需的。您真正需要做的就是复制ServiceContract接口,告诉代码在哪里可以找到服务的端点,就这样。您可以使用很少的代码从服务调用方法。使用此方法,您可以完全控制实现。不管您选择哪种方法来生成代理类,Michele都会在其中显示和使用这两种方法。 杰出的 关于这个主题的一系列网络广播。

    Michele有很多很棒的资料,我建议你看看她的网站。以下是一些在我学习WCF时对我非常有用的链接。我希望您能够认识到WCF有多强大,实现起来有多容易。学习曲线有点陡峭,但是你的时间投资回报是值得的:

    我建议你至少看一次米歇尔的网络广播。她是一个非常有效的演讲者,她显然在WCF方面知识渊博。她做了一个伟大的工作,使自上而下的世界自然基金会内部工作的神秘化。

        3
  •  14
  •   Saab    16 年前

    我很难知道什么时候应该或将使用WCF。为什么?因为我把工作效率和简单性放在首位。为什么ASMX模型如此成功,因为它工作了,并且让它工作得很快。与2005和.NET2.0wsdl.exe相比,它提供了非常好的、兼容的服务。

    在现实生活中,您的体系结构中应该只有很少的通信协议。这使它简单易维护。如果您需要访问遗留系统,请为它们编写特定的适配器,以便它们能够在漂亮的、闪亮的SOA世界中发挥作用。

        4
  •  13
  •   Karl    16 年前

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

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

        5
  •  6
  •   Quibblesome    16 年前

    等待。。。。你曾经用过.NET远程处理吗,因为这是它真正的替代品。.NET远程处理本身相当复杂。我发现WCF更容易和更好的布局。

        6
  •  4
  •   Dave Ward    16 年前

    我不认为它经常提到,但是你 可以 仍然使用WCF实现相当简单的服务,非常类似于ASMX服务。例如:

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

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

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

        7
  •  4
  •   Community    7 年前

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

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

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

        8
  •  3
  •   blowdart    16 年前

    如果您正在使用VS2008并创建一个WCF项目,那么当您点击run/debug时,您将自动获得一个测试工具,并且您可以添加一个引用而不必使用svcutil。

        9
  •  2
  •   NoizWaves    16 年前

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

    1. 使用泛型编程您自己的代理/客户端层(参见类 ClientBase 装订)。我发现这很容易工作,但很难完美。
    2. 使用第三方实现1( SoftwareIsHardwork 是我现在最喜欢的)
        10
  •  2
  •   Babak.Abad    10 年前

    WCF 是以前所有人的替代品 Web服务 微软的技术。它也比传统的“Web服务”做得更多。

    WCF“Web服务”是通过WCF实现的更广泛远程通信范围的一部分。与传统的ASMX相比,在WCF中执行操作的灵活性和可移植性要高得多,因为WCF的设计从一开始就是为了总结Microsoft提供的所有不同的分布式编程基础架构。WCF中的一个端点可以通过SOAP/XML和TCP/Binary一样轻松地进行通信,而更改这个媒介仅仅是一个配置文件mod。理论上,这可以减少移植或更改业务需求、目标等时所需的新代码量。

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

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

    主要区别在于Web服务使用XmlSerializer。但WCF使用的DataContractSerializer性能比XmlSerializer要好。

    在什么情况下必须使用WCF

    • 处理业务事务的安全服务。一项服务
    • 向其他人提供当前数据,如交通报告或其他
    • 监控服务。一种聊天服务,允许两个人
    • 实时通信或交换数据。仪表板应用程序
    • 对一个或多个服务进行数据轮询,并以逻辑方式显示
    • 演示。显示使用Windows工作流实现的工作流
    • 作为WCF服务的基础。要轮询的Silverlight应用程序
    • 最新数据源的服务。

    WCF的特点

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

    来源: main source of text

        11
  •  1
  •   Ben Collins    16 年前

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

        12
  •  1
  •   Domenic    16 年前

    就它提供的内容而言,我认为答案是兼容性。ASMX服务是相当小的软件。并不是说他们没有尝试与其他消费者兼容;但除了ASP.NET网页和其他一些自定义的微软消费者外,该模型并不适合其他消费者。然而,由于WCF的体系结构,它允许您的服务拥有非常开放的基于标准的端点,例如REST、JSON等,以及常见的SOAP。其他人可能会比您的ASMX更容易花费您的WCF服务。

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

        13
  •  1
  •   Kwal    16 年前

    WCF不应被认为是ASMX的替代品。从它的位置和微软内部使用的方式来看,它实际上是一个基本的体系结构,可用于任何类型的跨边界通信。

        14
  •  1
  •   pglowack    16 年前

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

        15
  •  1
  •   community wiki StingyJack    16 年前

    我在WCF中发现的困难是管理客户机和服务器的配置,并排除不太好的故障状态异常。

    如果有人有捷径或小窍门,那就太好了。

        16
  •  1
  •   Ian Ringrose    14 年前

    我发现这是一种痛苦;因为我在两端都有.NET,在两端都加载了相同的“契约”DLL等,但是之后我必须处理很多细节,比如“knowntype”属性。

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

    .NET远程处理通常只起作用。

    我想试着 假装 基于.NET到.NET对象的通信与向未知系统发送位so-of-text(XML)相同,这是一个太远的步骤。

    (几次我们使用WCF与Java系统交谈时,我们发现Java系统给出的XSD与它想要的XML不匹配,因此不得不手工编写很多XML映射。)