我对 WCF 缺少啥?

Posted

技术标签:

【中文标题】我对 WCF 缺少啥?【英文标题】:What am I missing about WCF?我对 WCF 缺少什么? 【发布时间】:2010-10-29 19:31:03 【问题描述】:

我在 MS 技术方面的开发时间比我在这个阶段想记住的要长。当 .NET 出现时,我认为他们一针见血,随着每次迭代和版本,我认为他们的技术越来越强大,并期待每个版本。

但是,由于去年不得不与 WCF 合作,我必须说我发现这项技术很难使用和理解。最初它非常吸引人,但是当您开始深入了解它时,配置是一场噩梦,必须覆盖消息大小、消息中包含的对象数量、安全模型的复杂性、出现故障时处理代理以及最后的代理回到用代码而不是 XML 定义接口。

它不能开箱即用,我认为它应该。我们在测试自己或产品出厂时发现了上述所有问题。

我确实理解这一切背后的基本原理,但他们肯定可以想出更简单的实现机制。

我想我要问的是,

我是否以错误的方式查看 WCF? 它有什么优势? 替代品? 什么情况下应该 选择使用 WCF?

好的伙计们,很抱歉延迟回复,工作确实有一个讨厌的习惯,有时会妨碍你:)

一些说明 我想我对 WCF 的主要油漆点属于以下领域 虽然它确实是开箱即用的,但您的左侧还有一些重大惊喜。正如上面所指出的,基本的东西在被覆盖之前是受限的

    可以传递的字符串大小不能超过 8K 可以在单个消息中传递的对象数量受到限制 代理无法自动从故障中恢复 配置量虽然存在是件好事,但了解这一切以及使用什么以及在什么情况下可能很难理解。尤其是在现场部署具有不同安全要求的软件时等。在谈到配置时,我们不得不将很多我们的软件隐藏在后端数据库中,因为现场的安全和网络人员试图在不了解的情况下更改配置文件中的内容它。 将接口的配置保留在代码中,而不是迁移到 XML 中明确定义的接口,几乎可以发布和使用任何东西。我知道我们可以从程序集中导出 XML,但它充满了垃圾,并且某些代码生成器会阻塞它。

我知道世界在不断发展,在过去(我已经开发了 22 年)我已经多次前进了,并且正在积极使用 WCF,所以不要误会我的意思,我明白什么它的用途和方向。

我只是认为应该有更简单的配置/部署选项,更简单的设置和更好的配置管理(可能是 SQL 配置提供程序,而不仅仅是 web.config/app.config 文件)。

【问题讨论】:

如果将其改写为“您如何克服 WCF 的复杂性”问题,则很有用。并将其标记为社区维基 我无法支持您的说法:“它只是不能开箱即用” - 我认为它可以 - 大时代!它比 ASMX、Remoting 和其他不能一起工作的东西更灵活、更强大、更有用。这是一个统一的通信框架——实际上它非常引人注目! 你没有错过任何东西。它会像 DCOM 一样消失,正是出于您概述的原因。 WS 或 SOAP 从未启动过,也不太可能启动。 Dare 对此进行了广泛的介绍,您可以看到 Amazon 和 Google 提供的内容。非常简单有效的 api,并且没有您使用 wCF 获得的锁定。并且不要忘记,在选择 WCF 时,有一整类应用程序根本不适合功能要求。其中之一是优秀的流媒体模型、高性能应用、P2P、游戏,应有尽有 然后MS意识到哦wtf:json,pod,rest等等。因此,突然急于将更多模型和类修补到框架中。典型的过度工程.. 是的,但 WCF 中的 REST 仅支持每个处理程序 1 个动词,您不能在同一个处理程序上使用 GET 和 POST。 JSON 也有类似的问题,返回的数据是用非标准的包装格式包装的。 AJAX ScriptManagers 不能嵌入到用户控件中以支持 AJAX,需要借助脚本库(如优秀的 dojo/jquery)来提供这些功能。因此,即使使用 REST 和 JSON 等所谓的标准实现,WCF 仍然存在问题。 【参考方案1】:

我现在一直在使用 WCF,我分享你的痛苦。看起来它被严重过度设计了,但我们会坚持很长时间,所以我正在努力学习它。

我可以肯定的一点是,XML 很糟糕。除了使用 XML 来控制它之外,我什么都没有遇到过问题,并且已经切换到通过代码处理所有事情。

【讨论】:

您是否尝试过使用 WCF 配置工具(Windows SDK 目录中的 SvcConfigEditor)?没有 XML。 没有 XML 是什么意思? XML 仍然用无用的垃圾把我的 app.config 文件弄得乱七八糟。 它可能会弄乱你的 app.config 文件,但你不需要阅读它。只是折叠它。 这对服务器上只有记事本的生产支持人员没有帮助。 当您第一次配置项目时,WCF 配置工具很不错,但实际上它只是对丑陋的 xml 部分的漂亮包装(很像丑陋代码周围的#region 标签)。【参考方案2】:

您列出的问题是:


    可以传递的字符串大小不能超过8K 单个消息中可以传递的对象数量受到限制 代理无法自动从故障中恢复 配置量虽然存在是件好事,但了解这一切以及使用什么以及在什么情况下可能很难理解。尤其是在现场部署具有不同安全要求的软件时等。在谈到配置时,我们不得不将很多我们的软件隐藏在后端数据库中,因为现场的安全和网络人员试图在不了解的情况下更改配置文件中的内容它。 将接口的配置保留在代码中,而不是迁移到 XML 中明确定义的接口,几乎可以发布和使用任何东西。我知道我们可以从程序集中导出 XML,但它充满了垃圾,并且某些代码生成器会阻塞它。

这是我的看法:

(1) 解决了客户对 ASMX 的担忧。它太开放了,没有办法轻易控制它。如果您知道在哪里看,8k 限制很容易解除。我想你可以认为这是一个惊喜,但这更像是一次性的事情。一旦你知道它,你可以举起它并永远完成它,如果你愿意的话。

(2) 也是可配置的。

(3) 是已知的,但是有一些样板方法可以解决这个问题。例如,StockTrader 代码演示了一种经过验证的模式。您可以在自己的应用程序中重复使用代码。不确定这是否在 WCF for .NET 4.0 中得到修复。我知道这是一个公开的请求。

(4) 配置是野兽。这是很多人关心的问题。这里的问题是 WCF 非常灵活,所有这些灵活性的配置都通过 xml 文件公开。它可能是压倒性的。一种似乎有效的方法是在需要时分小部分服用。

(5) 我不明白。

【讨论】:

关于4,为什么不加密文件而不是存储在数据库中? (4) 一般需求不需要配置。 WCF 的 web.config/app.config 编辑器对于大多数开发者来说已经绰绰有余了。 (5) 执行任何类型的合并后,Visual Studio 也不会。【参考方案3】:

比起 WCF,我更喜欢 ASP.NET MVC 和 Web API。如果我必须向刚接触 WCF 的开发人员总结一下,我会说:“WCF 是一种善意的尝试,旨在取代过度设计的 Java EE 风格的 RPC 开发。”不幸的是,做出的许多决定都要求您成为配置低级别、不重要的项目(消息大小、超时、无意义的协议元素等)的专家,同时抽象出绝对关键的部分(URL 设计、参数序列化、响应序列化等)。 )。我所知道的使用 WCF 与 Web API 的团队之间的生产力和恶化的差异是白天和黑夜。

澄清一点:我一直讨厌 .NET Remoting 的核心概念。我觉得开发者需要彻底了解他们的应用程序的资源结构以及这些资源是如何序列化的。此外,在需要扩展的读取繁重的应用程序中,使用“POST”动词进行简单的数据检索是令人担忧的。

【讨论】:

【参考方案4】:

我会在澄清后解决您的其余问题。同时,我可以解决您关于何时应该选择使用 WCF 的问题:总是。

WCF 是旧 ASMX 技术(包括 WSE)的替代品。它也是 .NET Remoting 的替代品。在可预见的未来,它是 .NET 中高级通信功能所基于的唯一技术。

例如,考虑 Windows Azure。 WCF 涵盖了“云计算”这一新概念的通信方面并非不可避免。然而,WCF 足够灵活,可以扩展到涵盖这些情况,而代码更改很少。

如果您在使用 WCF 时遇到问题,那么您最好确保 Microsoft 知道这一点。 WCF 是 .NET 中 Web 服务和其他面向服务的开发的现在和未来,因此他们非常有动力倾听您的意见并解决您的痛点。要么直接通过Connect 联系他们,要么在这里在 SO 上提问(请用 WCF 标记),很多人会帮助你。

【讨论】:

更新了上面的描述,增加了一些要点。感谢 Binary Warriors 的重新开放以及迄今为止的所有贡献。我确实喜欢堆栈溢出。 “为什么投反对票?这其中有什么不准确的吗?” -> “什么时候应该选择使用 WCF:总是” - 所以,简而言之,是的。 @mattmc3:你在几个方面都错了。 WCF 不是微软要去的地方。他们已经在那里好几年了。 ASMX 是他们曾经去过的地方,现在它被认为是一种“遗留技术”。因此,我认为它不适用于新代码中的大多数生产用途。我还认为,如果您觉得配置是一个问题,那么您一定没有关注 .NET。测试表单无论如何对于任何传递或返回复杂对象的操作都是无用的,并且不能用于测试除了http服务之外的任何东西。 企业的需求不必依赖于 MS 认为的“遗产”。我们开发人员喜欢忘记这一点,因为我们喜欢玩新玩具。当然,您可以不同意,但不要相信您或 MS 已经说服每个人只是为了转换而转换。坦率地说,WCF 的过渡故事在所有方面还没有那么引人注目。不过,对于远程处理,WCF 是一个巨大的改进。但是对于快速而肮脏的 Intranet Web 服务,您可能会在 web.config 中浪费太多宝贵的时间。 我已经学会了,并且已经开发了相当数量的它们 - 但我并不急于修复我们旧的和工作的 .ASMX 服务。老实说,从 ASP.NET MVC 控制器构建 RESTful JsonResults 只需要一小部分开发时间,所以我建议尽可能跳过正式的 Web 服务。【参考方案5】:

程序员的角度来看,使用 WCF 的最大优势:将公开服务(操作、合同等)的定义与协议的具体细节分开,这与 ASMX 不同,您直接在代码中将类公开为 Web 服务使用属性。使用我的一个真实示例:我们能够轻松地在 Web 服务和命名管道之间切换传输协议,无论哪种方式更适合部署和性能需求,而无需更改一行代码。

【讨论】:

【参考方案6】:

为了解决应用程序配置维护噩梦的问题,一些标准如 UDDI 或 WS-Discovery 存在,WS-Discovery 将在 .NET 4.0 中被 WCF 支持。

保持配置 代码中的接口而不是移动 显式定义接口 XML,可以发布和 几乎被任何东西消耗。我知道我们 可以从 assembley 中导出 XML, 但它充满了垃圾和肯定 代码生成器窒息它。

你能更明确一点吗?我认为您正在谈论在代码中配置的服务行为。 您可以轻松地编写行为扩展代码来配置您在配置文件中谈论的内容,而不是代码,但我认为如果微软没有这样做,那是有充分理由的。 例如具有这种行为的服务:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, ConcurrencyMode=ConcurrencyMode.Single)]

实现知道实例不在多个线程之间共享,因此它的开发方式不同于:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple)]

在这种情况下,服务实现应该注意并发问题。 该实现与属性 ServiceBehavior 耦合,因此在 XML 文件中移动此行为不是一个好主意。

如果您可以在配置文件中将 InstanceContextMode.PerCall 服务更改为 InstanceContextMode.Single 服务会怎样?你破坏了应用程序!

【讨论】:

您能否更具体地谈谈配置的维护噩梦? 如果你部署了一个服务,并且你有 15 个客户端,如果服务改变了他的绑定或者他的地址(包括字符串的最大大小,或者你的对象图的最大深度),客户端应该手动更新他们的服务参考。或者,您可以在不更改旧版本的情况下创建服务的新版本以实现向后兼容性。 Ws-Discovery 或 UDDI 解决了这个问题,客户端只知道一个合约,它向 UDDI 询问 Ws-Discovery 如何访问它。信息:***.com/questions/647816/… 谢谢。有没有人真正使用 WS-Discovery 或UDDI?他们是否只更新配置信息而不更新合约? 不是合同,因为如果合同改变,客户端的代码也应该改变。如果你的合同改变,唯一的解决方案是提供你的服务的多个版本。这不是黑客,而是一种常见的做法.(通常你的服务的命名空间包含你的服务的创建日期,就像一些标准所做的那样,例如ws-addressing的命名空间是schemas.xmlsoap.org/ws/2004/08/addressing)。存在一些实现(codeproject.com/KB/WCF/ws-discovery.aspx),but我认为等待微软使用 WCF 4.0 的实现来使用它是一个更好的解决方案【参考方案7】:

WCF 旨在用于 SOA 方法。专业地使用它是一场噩梦。我交付了一个使用 WCF 作为工具和地狱的 SOA 解决方案,数百个配置和隐藏技巧!我过去使用旧式 Web 服务和远程处理的分布式解决方案更稳定。我花了几天的时间来解决“底层连接已关闭:发生意外错误”错误的解决方案,这对于同一合同中的 4 种方法中的一种方法来说毫无意义。我非常失望。这让我回到了 .net 第一次引入很多承诺的时候,当我们动手时,地狱,日志问题出现了!

【讨论】:

措辞不佳,轶事,主观。 在确定最佳配置选项方面,这个描述符合我自己的经验。查找所有信息是地狱,而且 xml (app.config) 不是输入配置选项的好格式,尤其是那些应该是只读的。这个 SO 条目中的所有内容都不是主观的吗?【参考方案8】:

看看您提到 XML 和 SQL 的方式,您正在使用 WCF 构建 Web 应用程序或实际的 Web 服务(Web 上的服务,而不仅仅是 SOAP 交换)。

它有助于将 WCF 视为 .NET Remoting(或 DCOM、CORBA 等)的替代品,后者也恰好支持将 Web 服务作为一种传输方式。在程序集中声明的接口、代理的行为、某些配置选项和框架的其他方面,从 Web 应用程序的角度来看看起来不自然和复杂 - 实际上对于分布式对象的 DCOM 样式系统来说是开箱即用的。

回答这个问题:不,您没有遗漏任何东西,并且将 WCF 用于 Web 应用程序很复杂,因为 WCF 不是用于构建 Web 应用程序的框架。可能这样的框架可以建立在它之上,但我不希望看到 WCF 本身更改为进入 Web 领域。

【讨论】:

您认为 WCF 的哪一部分使 Web 应用程序变得困难? 问题本身有一个列表。最突出的可能是接口的 web 可访问声明是从代码生成的,相反,对于 web 来说更自然。对我来说,这是 WCF 的一个优势。 您知道任何不通过代码生成其合同的网络可访问声明的网络服务技术吗?我知道的唯一例外是首先创建 WSDL,而且大多数人不想这样做。 您可以使用 WCF 执行“WSDL First”。 google.com/search?hl=en&rls=com.microsoft%3A*&q=wsdl+first+WCF 正如您所指出的,并非每个人都想这样做。但这是一种选择。

以上是关于我对 WCF 缺少啥?的主要内容,如果未能解决你的问题,请参考以下文章

我对 boost::mpi::request 缺少啥?测试似乎改变了状态

我在 XMLHttpRequest 中缺少啥?

缺少相互证书的 Wcf 请求 wsse:Security

使用 WCF 的 Http 请求中缺少授权标头

从 WCF 服务返回的 XML 中缺少集合项值

缺少基于任务的 WCF 服务的帮助描述