WCF Ping






4.63/5 (5投票s)
一个用于 ping WCF 服务的命令行实用程序
引言
在 WCF 服务托管在 ServiceHost
中之后,没有直接的方法来检查 WCF 服务是否正在运行。可以订阅 ServiceHost
事件并在 ServiceHost
启动或发生故障时触发警报。 对于通过 HTTP 绑定公开的服务,如果启用了 HTTPGet
,您可以选择通过浏览器访问 URL 来查询元数据。 对于通过 TCP 和 NamedPipe
绑定公开的服务,没有直接可用的选项。 我认为像 Ping 这样的命令行实用程序会非常方便。 这个命令行实用程序就是为了这个目的。 它可以帮助您 ping WCF 服务。
致谢
我想感谢以下两篇文章的作者。 我只是在它们之上构建了这个实用程序。
- 动态代理工厂,作者:Vipul Modi
- 在 WCF 中添加动态方法,作者:Zulfiqar
概念
一个典型的 Ping 实现需要服务公开一个可以被调用者查询的方法。 该方法通常从服务返回一些数据。
从设计的角度来看,Ping
方法可能并不总是服务契约的一部分。 并且将一个方法永久地添加到每个契约中也不是很优雅。 在不影响这两个方面的情况下,我们可以通过使用 WCF 扩展的概念(操作行为)来实现拥有 Ping
方法的目标。 该行为会将我们需要的 Ping
方法添加到运行时所有契约中。 通过在配置文件中的一个简单设置关闭此行为,可以生成不包含此方法的代理并在开发期间分发。 当服务部署后,可以启用该行为以在实时环境中进行测试或诊断。
现在 Ping
方法已经准备好,让我们看看调用者是如何工作的。 调用者的主要工作是通过服务代理调用 Ping
方法。 由于该实用程序需要足够通用,以便可以与任何 WCF 服务一起使用,因此静态代理不能绑定到调用者。 因此,WCF 服务代理应该在运行时动态创建。 这将使该实用程序保持通用。 以下是调用者所做的事情。 给定 WCF MEX URL,调用者下载元数据,构建客户端实例并调用动态添加到契约中的 Ping
方法。
作为先决条件,该实用程序希望服务通过 IMetadataExchange
公开元数据的查询,并且在交换绑定上没有定义任何安全性。
实现
该实现相当容易理解。 所以我没有在这里展示任何显式代码。
该解决方案包含 3 个项目。WCFPing.Hosting
、WCFPing.Lib
和 WCFPing
。WCFPing.Lib
包含用于添加动态 ping
方法的所有核心类,以及一组用于通过动态代理调用 Ping
方法的类。WCFPing.Hosting
展示了如何托管启用了 Ping
行为的服务。WCFPing
是用于 Ping
服务的命令行实用程序。
WCFPing.Lib 下的 XtensionMethods.cs 的扩展方法 EnablePing
提供了在运行时添加 Ping
方法的实现。 正如文章 在 WCF 中添加动态方法 中所解释的那样,该实现很简单。 Ping
方法采用一个 string
参数并返回一个 string
值,其中包含附加了服务器时间的输入 ping 返回数据。
WCFServicePing
类负责调用者的工作。 该类由 WCFPing
控制台应用程序调用。 该类负责在动态创建的服务代理实例上调用 Ping
方法。 动态代理背后的逻辑在文章 动态代理工厂 中进行了解释。 我已经完全重构了代码,只保留了此实现所需的内容。
WCFServicePing
类首先通过 MetadataImporter
导入给定服务的元数据。 使用元数据,通过 ServiceProxySourceGenerator
生成代理的完整源代码。 使用代理源,使用 ServiceProxyAssemblyFactory
生成动态程序集。 从程序集中,使用 ServiceProxyInstanceFactory
实例化代理客户端。 最后,在客户端实例上调用 Ping
方法。
用法
可以从命令提示符启动 WCFPing
。 用法和输出如下图所示。

通过使用 -verbose
开关可以获得更详细的输出,如下图所示。 此开关提供错误时的完整异常堆栈。

作为一个例子,我在 WCFPing.Hosting
项目下提供了一个简单的 WCF 服务。 您可以启动此应用程序,然后运行实用程序项目 WCFPing
来检查 ping 的工作方式。
结论
这就是 WCFPing
。 希望您发现这个实用程序有用。
历史
- 2010 年 6 月 28 日:首次发布