【问题标题】: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 服务(附加控制台窗口)时,我得到以下信息:

    希望这会有所帮助!

    亚历克斯

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多