在wcf服务和其托管窗口服务之间传递数据

时间:2014-01-03 16:05:59

标签: c# wcf windows-services

我有一个项目要求我与服务器通信。我需要将从客户端的独立应用程序处理的数据发送到服务器。为此,我使用的是与服务器交互的wcf服务。此服务托管在Windows服务中。现在我的问题开始了。我需要监视一个文件夹,写/读一些文件并删除它们。为此我使用与托管wcf服务的Windows服务相同的Windows服务。如何在两个服务之间传递数据?例如,我想使用Windows服务读取文件并将数据传递给wcf服务,然后将其传递给服务器并返回。

1 个答案:

答案 0 :(得分:1)

如果您只想在Windows服务中托管的两个服务之间进行通信,我使用的一个解决方案是在Windows服务本身中存储静态会话状态。在Program.cs中,我声明了一个存储会话状态的静态字段,我修改了我的两个服务的构造函数来引用这个对象:

static class Program
{
    private static SessionState sessionState = new SessionState() { SessionID = "100" };

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] servicesToRun;
        servicesToRun = new ServiceBase[] 
            {
                new Service1(sessionState),
                new Service2(sessionState)
            };

        ServiceBase.Run(servicesToRun);
    }
}

我有一个名为SessionState的类,我用它来存储我想在托管服务之间传输的任何数据。在这个例子中,我只是给会话一个ID属性:

public class SessionState
{
    public string SessionID { get; set; }
}

Service1和Service2存储对静态会话状态的引用,在我的示例中,我只修改了两个线程之一中的sessionID:

public partial class Service1 : ServiceBase
{
    private SessionState sessionState;

    public Service1(SessionState sessionState)
    {
        this.sessionState = sessionState;
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Console.WriteLine("Service 1 started.");
        Task tsk = new Task(() => this.DoStuff());
        tsk.Start();
    }

    protected override void OnStop()
    {
    }

    private void DoStuff()
    {
        Console.WriteLine("Session state for service 1 is " + this.sessionState.SessionID);

        Thread.Sleep(2000);

        Console.WriteLine("Session state for service 1 is " + this.sessionState.SessionID);
    }
}

public partial class Service2 : ServiceBase
{
    private SessionState sessionState;

    public Service2(SessionState sessionState)
    {
        this.sessionState = sessionState;

        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Console.WriteLine("Service 2 started.");
        Task tsk = new Task(() => this.DoStuff());
        tsk.Start();
    }

    protected override void OnStop()
    {
    }

    private void DoStuff()
    {
        Console.WriteLine("Session state for service 2 is " + this.sessionState.SessionID);

        Thread.Sleep(1000);
        this.sessionState.SessionID = "200";

        Console.WriteLine("Session state for service 2 is " + this.sessionState.SessionID);
    }
}

现在,当我运行Windows服务(附带控制台窗口)时,我得到以下内容: Windows service runs from a console window

希望这有帮助!

亚历

相关问题