在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency
Posted
技术标签:
【中文标题】在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency【英文标题】:Using SqlDependency in WCF Class Library project hosted as Windows Service 【发布时间】:2019-05-02 09:53:33 【问题描述】:我使用SqlDependency
创建了一个通知服务,用于通知其他服务有关特定表的更改。这是在 Visual Studio 的 Windows 服务模板中完成的。因此在OnStart
事件中,SqlDependency
的订阅被创建,在OnStop
事件中,取消订阅被完成。
上述解决方案运行良好。
现在,由于某些原因,我必须将此作为 WCF 类库项目并将其作为 Windows 服务托管。我想不出在这种情况下可以在哪里订阅和取消订阅SqlDependency
。
Windows 服务启动后,订阅必须自动完成。
注意:我有一个通用的 Windows 服务主机,它将托管我所有的 WCF 类库项目,并且不能在那里做很多事情。
是否有任何解决方案或解决方法?
【问题讨论】:
您的通用 Windows 服务主机是否以某种形式实现 OnStop 信令或尊重 IDisposable? 我的回答能满足你的需求吗? 【参考方案1】:我希望我能解决您的问题。您拥有 WCF 库中的所有逻辑,但不知道如何在将托管您的 WCF 服务的 Windows 服务启动时同步您的订阅和取消订阅 SqlDependancy 事件。
我的想法是使用 ServiceHostFactory 来创建服务的实例,并挂钩服务的打开和关闭事件,从那里调用所有必要的构造函数和连接器。
我的大部分回答来自 this 关于托管 WCF 服务的精彩而冗长的文章,链接直接指向您案例中的主题。关于ServiceHost 和ServiceHostFactory 类的一些附加文档。
请记住,这不是您可以复制/粘贴的完整代码,而是使用演示。
这是您的 Windows 服务的示例:
public partial class YourWindowsService : ServiceBase
// It's your choice where to create this instance, I used constructor injection here arbitrarily
private readonly YourWCFServiceFactory serviceFactory;
private ServiceHost host;
public YourWindowsService(YourWCFServiceFactory serviceFactory)
InitializeComponent();
this.serviceFactory = serviceFactory;
protected override void OnStart(string[] args)
Type serviceType = typeof(YourService);
host = serviceFactory.CreateServiceHost(serviceType, new string[] "yourBaseUri" );
host.Open();
protected override void OnStop()
if(host != null)
host.Close();
还有你工厂的例子:
public class YourWCFServiceFactory: ServiceHostFactory
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
host.Opening += new EventHandler(host_Opening);
host.Closing += new EventHandler(host_Closing);
return host;
private void host_Opening(object sender, EventArgs e)
// Initialization here
private void host_Opening(object sender, EventArgs e)
// Cleanup here
【讨论】:
以上是关于在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency的主要内容,如果未能解决你的问题,请参考以下文章
WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上
在 NetStandard 2.0 类库中托管 WCF 服务
想要将 WCF Web 服务作为 Windows 服务托管,而不是在 IIS 中托管
使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?