使用Web服务通常是一种出色的架构方法。而且,随着.Net中WCF的出现,它变得更好。
但是,根据我的经验,有些人似乎认为应该始终在数据访问层中使用Web服务来调用数据库。我不认为Web服务是通用解决方案。
我正在考虑使用几十个用户的小型Intranet应用程序。 Web应用程序及其Web服务部署到一个Web服务器,而不是Web场。将来不会有另一个可以使用此特定Web服务的Web应用程序。在我看来,调用Web服务的成本不必要地增加了Web服务器的负担。进程间调用受到性能影响。维护和调试Web应用程序和Web服务的代码更加复杂。部署也是如此。我只是没有看到在这里使用Web服务的优势。
有人可以通过创建Web应用程序的两个版本(包括和不使用Web服务)进行测试,并进行压力测试,但我还没有完成。
您是否对使用小型网络应用程序的Web服务有意见?在Web服务不是一个好的架构选择的任何其他场合?
答案 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)建议使用网络服务的这些场景是有道理的:
答案 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服务器与数据层分离。凭借直接的开发要求和出色的工具,我没有看到问题。
但不在以下情况下使用网络服务:
这是我的经历,希望有所帮助。
答案 6 :(得分:2)
对于小规模的网络应用程序(你必须问一个问题,“它是否总是保持小规模?”虽然)使用网络服务,单独的业务层,数据层等等可能是过度的。
在任何人开枪之前,我都同意层间逻辑的分离以及单元测试,持续集成等等都是血腥的。在我目前的角色中,如果没有他们,我会完全迷失并在角落里摇摆。然而,对于一个非常小规模的网络应用程序,例如,跟踪36名员工的公司的联系号码和地址,成本/收益分析表明上面列出的所有“细节”都是过度的。
然而......请记住提问“它会一直保持小规模吗?” : - )