WCF 概述及调试方法
从业务应用程序开发的视角对 WCF 进行回顾,并提供一些调试问题解决方法提示。
一条评论
在某些时候,人们需要明白业务应用程序与控制台应用程序是不同的。因此,网络上、博客和论坛上的这些评论,应该在现实开发流程中进行更仔细的核查,因为它们会误导他人。特别是对于 LINQ to SQL 和 WCF,我厌倦了阅读关于它们有多么棒、多么简单的文章,但事实是,LINQ to SQL 不适用于应用程序,主要是因为它不是线程安全的,并且存在其他相关问题(解释)。可悲的是,我也是试图采用它的受害者之一。WCF 虽然很棒,但也可能令人头疼。在网上搜索时,请始终记住互联网并非总是正确的,正如我在此写过的。我严重怀疑许多博文,虽然可能有所帮助,但并没有完全揭示真相和缺点。我一直喜欢微软技术,但也有其间接广告的限度。
遵循指示
回到正题。你们中的许多人都做了网上说的所有事情。添加一个 WCF 服务和一个服务引用,然后,一切就绪。即使是调试,每次我调试应用程序时,都会启动一个虚拟调试主机,我就可以调试服务了。一切都很好,对吧?
问题
首先,如果我没有运行需要该服务的解决方案的部分,会怎么样?为什么我必须忍受启动主机的开销?
其次,也是最严重的问题,真的有人尝试过调试一个服务及其所有底层类吗?在所有声称 WCF 多么棒的人中,有人尝试过使用“编辑并继续”功能吗?
我尝试了,正如你从我的态度所能猜到的,我无法使用“编辑并继续”。当我开发一个大型应用程序时,通常服务后面至少会有两个层。我每次都需要重新启动应用程序吗?别让我提起调试通过虚拟客户端,当我的一个操作合同使用一个复杂的数据类型时。这根本不可能。
那么解决方案是什么?
有人可能会说很简单,但说起来容易做起来难。就像处理 .NET Remoting 一样,如果服务位于你的输出目录中,无论通过何种技巧,只需以你选择的地址以编程方式启动主机,然后告诉客户端访问该地址。这样,你始终模拟通过 WCF 通道的数据传输(非常重要),当然你还可以使用“编辑并继续”功能。
问题在于,解决方案启动的虚拟服务一直在运行,这非常烦人。我还没有找到解决方案,主要是因为在我开发的框架中,有一个单一的操作合同处理抽象的消息类型。这对我来说是 WCF 的另一个重要里程碑。我真的不明白为什么他们让 DataContractSerializer
如此复杂,而不是像普通老式 Remoting 那样简单。将此服务置于我的框架中,我在 WCF 服务中就没有解决方案,因此就不会因启动调试主机而产生任何开销。
最后一个问题
最后,一个令我感兴趣并且花费了我半天时间才找到的最后障碍。我为 Remoting 部分实现了一个提供程序类,它会在需要时启动服务主机。在测试项目中一切都很好,但不知何时,我尝试用 WPF 扩展框架。
在第一次请求时,通过静态构造函数,我检查是否需要托管服务,然后进行了托管。但从 WPF 调用时,这并没有奏效。唯一的错误是超时异常。我都要抓狂了,然后我明白了。永远不要完全相信第三方库。
解决方案
我创建了三个客户端:一个控制台应用程序,一个 Windows 应用程序,和一个 WPF 应用程序,并简化了我的框架功能进行测试。在每个 UI 客户端,我在 UI 响应后发出调用(并随后启动主机)。结果发现,当通过按钮点击事件进行调用时,Windows Forms 的表现不正确。当我看到这一点时,我将主机启动时间提前到了 UI 部分完全初始化之前,你猜怎么着?一切都运行得很好。
我真的不明白为什么这一点没有被提及。
结论
对我而言,WCF 适用于底层管道。它比 .NET Remoting 复杂得多,而且如果你在做一些不寻常的事情时,它非常难以排查,而这些事情在所有这些赞扬的文章和帖子中都有讨论。也许我没有深入研究,也许我遗漏了什么,但如果是这样,请告诉我,一个被宣传为简单且能解决所有 Remoting 问题的东西,怎么会如此难以使用和调试。你会说 WPF 也有一个陡峭的学习曲线,但 WPF 并没有被宣传为编程世界所缺失的魔术。自从我读到它以来,每个人都提到它很难上手,不适用于所有类型的应用程序。对我来说,WPF 是 .NET 3 的明星。
尽管存在所有这些问题,我仍然坚信 WCF,因为它支持其他很棒的功能。关于安全性,微软在此处表示:
你不应在生产环境中使用 WCF Service Host 来托管服务,因为它并非为此目的而设计。WCF Service Host 不支持此类环境的可靠性、安全性及可管理性要求。相反,请使用 IIS,因为它提供了卓越的可靠性和监控功能,并且是托管服务的首选解决方案。在服务开发完成后,您应将服务从 WCF Service Host 迁移到 IIS。
考虑到这一点,我忍不住想,WCF 是否给开发带来了巨大的开销,而 .NET Remoting 是一个在 IIS 下经过充分测试的解决方案。但选择已经做出,主要是因为我相信新技术将会持续下去。