在作为 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 项目。如何?

从作为 LocalSystem 运行的 WCF 托管服务以特定用户身份启动进程

如何为 SOA 有效管理/托管许多 WCF 服务