什么时候不应该使用Web服务?

时间:2008-10-15 13:14:02

标签: asp.net web-services architecture web-applications

使用Web服务通常是一种出色的架构方法。而且,随着.Net中WCF的出现,它变得更好。

但是,根据我的经验,有些人似乎认为应该始终在数据访问层中使用Web服务来调用数据库。我不认为Web服务是通用解决方案。

我正在考虑使用几十个用户的小型Intranet应用程序。 Web应用程序及其Web服务部署到一个Web服务器,而不是Web场。将来不会有另一个可以使用此特定Web服务的Web应用程序。在我看来,调用Web服务的成本不必要地增加了Web服务器的负担。进程间调用受到性能影响。维护和调试Web应用程序和Web服务的代码更加复杂。部署也是如此。我只是没有看到在这里使用Web服务的优势。

有人可以通过创建Web应用程序的两个版本(包括和不使用Web服务)进行测试,并进行压力测试,但我还没有完成。

您是否对使用小型网络应用程序的Web服务有意见?在Web服务不是一个好的架构选择的任何其他场合?

7 个答案:

答案 0 :(得分:34)

Web服务是数据访问的绝对可怕选择。这几乎是零利益的开销和复杂性。

如果您的应用程序要在一台计算机上运行,​​为什么否认它能够进行进程内数据访问调用?我不是在谈论从你的UI代码直接访问数据库,我说的是抽象你的存储库,但仍然包括他们在你正在运行的网站上的程序集。

在某些情况下,我建议使用Web服务(我假设您的意思是SOAP),但这主要是为了实现互操作性。

这里的服务粒度也有问题。 SOA意义上的服务将封装操作或业务流程。数据访问方法只是该过程的一部分。

换句话说:

  - someService.SaveOrder(order);  // <-- bad
    // some other code for shipping, charging, emailing, etc

  - someService.FulfillOrder(order);  //<-- better
    //the service encapsulates the entire process

为Web服务提供Web服务是不负责任的编程。

答案 1 :(得分:15)

夏洛特的杰出开发人员尼克·哈里森(Nick Harrison)建议使用网络服务的这些场景是有道理的:

  • 在Web场中,有多个托管网站的Web服务器,都指向在另一个Web服务器上运行的Web服务。这允许在多个服务器上分配负载。
  • 客户端/服务器,其中Windows表单应用程序可以调用Web服务。
  • 跨平台
  • 通过防火墙

答案 2 :(得分:6)

仅仅因为该工具生成了一堆存根并不意味着它是一个很好的用途。 WS- *在将服务公开给外部各方的情况下表现优异。这意味着每个操作都应该是业务流程的粒度而不是数据访问。

众多标准可用于详细描述合同的不同方面,而(假设的)完全兼容的WS堆栈可以消除第三方开发人员的痛苦,甚至可以实现传说中的点击集成a'la Yahoo Pipes。通过良好的治理控制,您可以根据需要改进公共接口并管理向后兼容性。

这一切几乎不可能自动生成。 C#存根生成器只知道类的物理接口,但对所涉及的语义一无所知。有关更详细的讨论,请参阅this paper

如果您正在构建网站,请构建一个网站。如果您希望在应用程序中使用异步消息传递,请使用MSMQ。如果要向内部客户端公开数据,请使用POX。如果您需要有效的二进制邮件格式,请检查Google的Protocol Buffers或者您是否需要RPC检查Hessian for C#或DCOM。

Web服务是一种粗粒度集成解决方案。它们是僵化的,它们比替代品慢,它们需要花费太多精力才能做得好(而且当做得不好时,它们就会毫无意义)。

总结:“什么时候应该使用的网络服务?” - 任何时候你可以在没有它的情况下离开

答案 3 :(得分:5)

如果您只是为您的Intranet编写一个小的(少于50个用户)Web应用程序,那么Web服务似乎有点过分。特别是如果不使用它的主要功能(提供对许多服务的单点访问)。

答案 4 :(得分:3)

我同意在小型Web应用程序中使用Web服务会增加一层似乎不合理的复杂性。我的大多数解决方案,互联网和内联网,10-50个用户,都不使用Web服务。我很高兴别人也有同感......我以为我是唯一一个。

答案 5 :(得分:3)

对于小规模的Web应用程序,我认为使用Web服务通常是个好主意,您可以使用它轻松地将Web服务器与数据层分离。凭借直接的开发要求和出色的工具,我没有看到问题。

在以下情况下使用网络服务:

  • 当您必须使用Http作为数据的传输和Xml序列化时,您需要同步且经常地使用大量不同的数据位。无论是REST还是SOAP还是WS- *,您都会遇到性能问题。您拨打的电话越多,系统就越慢。如果你想要中等大小的数据块不那么频繁,异步并且你可以使用直接的TcpIp(例如Wcf netTcpBinding)你会更好。
  • 当您需要从其他数据源查询和加入Web服务中的数据时,需要激励数据仓库,该数据仓库可以使用来自整个企业的正确合并和合理化的数据填充

这是我的经历,希望有所帮助。

答案 6 :(得分:2)

对于小规模的网络应用程序(你必须问一个问题,“它是否总是保持小规模?”虽然)使用网络服务,单独的业务层,数据层等等可能是过度的。

在任何人开枪之前,我都同意层间逻辑的分离以及单元测试,持续集成等等都是血腥的。在我目前的角色中,如果没有他们,我会完全迷失并在角落里摇摆。然而,对于一个非常小规模的网络应用程序,例如,跟踪36名员工的公司的联系号码和地址,成本/收益分析表明上面列出的所有“细节”都是过度的。

然而......请记住提问“它会一直保持小规模吗?” : - )