WCF和Windows服务通信

时间:2012-08-29 13:01:44

标签: windows wcf service

拜托,有人可以告诉我吗?我创建了WCF库,它实现了与外部WCF客户端作业的端点网络管道。我在Windows服务中放置了lib。但我不知道如何在不使用WCF客户端 - 服务器机制的情况下从库进行数据交换。如何在Windows服务中运行或获取运行WCF服务的数据?例如,我想在Eventlog中注册WCF错误,或者为服务提供参数,以便为连接到WCF的客户端传输它们。

在我的项目中,我需要实时创建用于工厂监控的Silverlight或WPF客户端。为此,我想在我的OPC客户端上使用wcf服务中的双工通道

我的Windows服务项目中有两个对象。一个对象是OPC客户端和数据库客户端。如果我在代码中创建这个对象 - 一切都很好。另一个对象是带有net.pipe绑定的WCF服务库,用于与此服务的外部连接。好。我在我的代码中定义:

// window service class   
 public partial class SyncSiemensService : ServiceBase
    {
        private OpcServiceClass opcServer = new OpcServiceClass();

        public SyncSiemensService()
        {
        InitializeComponent();
        }

    protected override void OnStart(string[] args)
    {
              // OPC client- database client object
              opcServer.Start();

             // WCF interface for external communication
             // with this windows service
              using (ServiceHost host = new ServiceHost(typeof(DuplexPipeWcfService)))
                         {
                             host.Open();
                             eventLog.WriteEntry("<Bla-Bla-Bla", EventLogEntryType.Information);
                         }
    }
}

WCF服务

    [OperationContract(IsOneWay = true)]
    void GetActValuesFromLine(string line);

字符串行 - 外部数据FOR opc对象

和他的回调

public interface IDuplexPipeWcfServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void ActualValuesUpdate(WcfDuplexActualValues value);
}
在矿井中出现

但是“WcfDuplexActualValues值” - 来自用于WCF中外部连接的OPC对象的数据。现在我不知道,如何在不使用OPC对象和WCF服务库之间的客户端服务通信的情况下从opc对象中检索数据。

非常感谢

2 个答案:

答案 0 :(得分:2)

您的OnStart方法会打开主机,然后立即再次关闭它。

 public partial class SyncSiemensService : ServiceBase
    {
        private ServiceHost _host;
        private OpcServiceClass opcServer = new OpcServiceClass();

        public SyncSiemensService()
        {
        InitializeComponent();
        }

 protected override void OnStart(string[] args)
 {
          // OPC client- database client object
          opcServer.Start();

         // WCF interface for external communication
         // with this windows service
          _host = new ServiceHost(typeof(DuplexPipeWcfService)))

         _host.Open();
        eventLog.WriteEntry("<Bla-Bla-Bla", EventLogEntryType.Information);

 }

}

您需要保持打开状态,并且只在关闭服务时将其丢弃。

答案 1 :(得分:1)

我并非100%确定我正确理解您的问题,但我认为您正在尝试使用WCF在您的OpcServiceClass实例与DuplexPipeWcfService 之间交换数据而不使用

您可以通过自己创建实例来使用其他方式来托管您的服务:

protected override void OnStart(string[] args)
 {
          // OPC client- database client object
          opcServer.Start();

          var serviceInstance = new DuplexPipeWcfService();
          _host = new ServiceHost(serviceInstance)

         _host.Open();
        eventLog.WriteEntry("<Bla-Bla-Bla", EventLogEntryType.Information);
 }

现在您有两个实例,您可以通过传递引用来交换数据。例如,您可以更改OpcServiceClass的构造函数:

protected override void OnStart(string[] args)
 {
          var serviceInstance = new DuplexPipeWcfService();
          opcServer.Start(serviceInstance );

          _host = new ServiceHost(serviceInstance)

         _host.Open();
        eventLog.WriteEntry("<Bla-Bla-Bla", EventLogEntryType.Information);
 }

您只需更改OpcServiceClass.Start()方法的签名即可获取IDuplexPipeWcfServiceCallback类型的对象。这样,您就可以与DuplexPipeWcfService进行通信,但不会产生WCF开销。

像这样更改签名:

OpcServiceClass.Start(IDuplexPipeWcfServiceCallback wcfService)