【问题标题】:Windows Service - WCF Service DesignWindows 服务 - WCF 服务设计
【发布时间】:2014-08-22 05:14:45
【问题描述】:

我有一个托管 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 中

【问题讨论】:

  • 似乎设计问题和实现问题在这里混合在一起。顺便说一句,使用静态看起来像是设计气味的第一个迹象。

标签: c# .net wcf service


【解决方案1】:

我完全同意Andy H

如果我查看这种代码,我不会尝试使这些东西与全局静态变量一起工作(即使最终这可能是可能的)。静态全局类很臭。首先,我会想办法让它在没有它的情况下工作。

有几种解决方案:依赖注入、消息通信、事件驱动……

帮助你:Web服务中长时间运行的进程很常见,你有一个很好的描述 here。但无论如何,它从不使用静态类来同步作业:)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多