在服务启动之前初始化 WCF 服务?

Posted

技术标签:

【中文标题】在服务启动之前初始化 WCF 服务?【英文标题】:Initialize WCF service before service starts? 【发布时间】:2011-08-16 21:34:27 【问题描述】:

我创建了一个包含 WCF 服务的程序集,这些服务在程序集的 app.config 文件中声明,并在我开始调试客户端应用程序时自动托管。这一切都有效。

问题是,我需要在托管服务之前运行一些初始化,特别是我需要收集要与 [ServiceKnownType("RegisterKnownTypes", typeof(ServiceKnownTypesHelper) 一起使用的已知类型的列表))] 属性(我使用 MEF 从我的程序集中收集 knowntypes,所以我不能只将它们放在配置文件中,因为它们在运行时是已知的,而不是之前)。

有没有办法在托管 WCF 服务之前进行初始化?我可以在服务类的构造函数中初始化东西,但是注册已知类型为时已晚。

【问题讨论】:

【参考方案1】:

这通常封装在派生的ServiceHost 中,您可以在其中通过覆盖OnOpening 方法在托管服务之前初始化任何内容。您还可以通过处理默认ServiceHost 上的Opening 事件来进行一些初始化,而无需实现新的ServiceHost

编辑:

正如您已经发现,为您的服务库生成的 .config 文件仅由测试工具 WcfSvcHost.exe 使用。应用程序本身必须在主 app.config / web.config 中有自己的配置,因此您可以根据需要更改库配置以进行调试。没有其他方法可以影响 WcfSvcHost.exe 中的ServiceHost 初始化。

【讨论】:

我指的是在 Visual Studio 2010 调试器中运行客户端应用程序时自动启动/托管的服务,而 WCF 服务项目位于同一解决方案中 - 在 WCF 服务程序集中,即正在托管,我可以找到服务主机吗? (对于独立的windows服务,这完全没有问题,我可以找到ServiceHost,但这对我的调试没有帮助)。 在这种情况下,您无法添加自定义初始化。该服务托管在 WcfSvcHost.exe 工具中,完全不受您的控制。它仅从您的程序集中加载服务类型来托管它们。 我突然想到:因为这是 wcf 程序集,而且该程序集的配置文件永远不会交付给任何客户,我可以以任何我想要的方式将配置文件弄乱。所以我可以将那些 knowntypes 添加到配置中。当他们改变时很混乱,但因为它只是为了调试没关系。 是的,这是真的。将其发布为答案。 @Sam:好的,我做了一些结论。

以上是关于在服务启动之前初始化 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 服务(托管 WCF 服务)在启动时立即停止

保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它

如何从 IIS 托管的 WCF 服务启动进程?

通过 Windows 服务托管 WCF 服务库获得 System.InvalidOperationException:尝试启动 WCF 服务

C# WCF 服务越界数组索引

WCF 是不是使用 ThreadPool 为 PerCall 服务启动新实例?