【问题标题】:Passing data between a wcf service and its hosting windows service在 wcf 服务与其托管 Windows 服务之间传递数据
【发布时间】:2014-01-03 16:05:58
【问题描述】:
我有一个项目希望我与服务器通信。我需要将从客户端的独立应用程序处理的数据发送到服务器。为此,我正在使用与服务器交互的 wcf 服务。此服务托管在 Windows 服务中。现在我的问题开始了。我需要监视一个文件夹,写入/读取一些文件并删除它们。为此,我使用与托管 wcf 服务的 Windows 服务相同的 Windows 服务。如何在两个服务之间传递数据?例如,我想使用 windows 服务读取文件并将数据传递给 wcf 服务,然后将其传递给服务器并返回。
【问题讨论】:
标签:
c#
wcf
windows-services
【解决方案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 服务(附加控制台窗口)时,我得到以下信息:
希望这会有所帮助!
亚历克斯