繁体   English   中英

Windows服务-WCF服务设计

[英]Windows Service - WCF Service Design

我有一个托管WCF服务的Windows服务,并且可以使用WCFTestClient和自定义客户端成功连接到它。 Windows服务基于以前的exe,但是由于该程序将用于服务器上长时间运行的进程,因此该服务是更好的途径。 问题是我无法从WCF服务访问应用程序中的静态变量。

在.exe(我将其切换为服务器应用程序.dll)中,我使用了一个如下实现的全局类:

public static class Globals
{
    ....
}

这保留了对程序主要部分的引用,因此,如果任何部分需要引用其他部分,则可以使用语法Globals.JobManager.RunJob()

我遇到的问题是WCF服务无法在运行时引用Globals GetJob方法是我需要完成此操作的一个示例:

public class ConsoleConnection : IConsoleConnection
{
    public string[] RetrieveJobList()
    {
        string[] jobs = Globals.JobManager.GetAllJobNames().ToArray();
        return jobs;
    }
}

在WCFTestClient中进行测试时,此方法返回null,并在创建的客户端中引发异常。

我相信此问题是由Windows服务,WCF服务和应用程序DLL的启动方式引起的。 当前方法是这样的:

public class ETLWindowsService : ServiceBase
{
....
    protected override void OnStart(string[] args)
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
        }

        Globals.InitializeGlobals();
        serviceHost = new ServiceHost(typeof(ConsoleConnection));

        serviceHost.Open();
    }
....
}

Windows服务在这里启动,调用创建应用程序所有必需部分的Globals.InitializeGlobals() ,然后启动WCF服务(如果这样做是错误的方式,请告诉我。我去)。 我假设这些操作以错误的顺序执行,这就是问题的原因。

我是否需要Windows服务创建WCF服务,然后依次创建应用程序(这对我来说没有意义),还是我需要Windows服务创建应用程序,然后再创建WCF服务? 还是我缺少第三种选择?

该应用程序位于.dll中,而WCF位于单独的.dll中

我完全同意Andy H的观点

如果我查看这种代码,则不会尝试使这些东西与全局静态变量一起使用(即使最后可能这样做)。 静态全局类很臭。 首先,我将设法使其在没有它的情况下工作。

有几种解决方案:依赖项注入,消息传递通信,事件驱动...

为了帮助您:Web服务中运行时间很长的过程非常普遍,请在此处进行详细说明。 但是无论如何,它从不使用静态类来同步作业:)

改进您的设计,您会发现当前的问题根本不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM