我有一个项目要求我与服务器通信。我需要将从客户端的独立应用程序处理的数据发送到服务器。为此,我使用的是与服务器交互的wcf服务。此服务托管在Windows服务中。现在我的问题开始了。我需要监视一个文件夹,写/读一些文件并删除它们。为此我使用与托管wcf服务的Windows服务相同的Windows服务。如何在两个服务之间传递数据?例如,我想使用Windows服务读取文件并将数据传递给wcf服务,然后将其传递给服务器并返回。
答案 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服务(附带控制台窗口)时,我得到以下内容:
希望这有帮助!
亚历