0

请问,有人可以给我建议吗?我使用外部 WCF 客户端创建了实现端点网络管道的 WCF 库。我将 lib 放置在 Windows 服务中。但是我不知道如何在不使用 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);

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

和他的回调

public interface IDuplexPipeWcfServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void ActualValuesUpdate(WcfDuplexActualValues value);
}

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

非常感谢

4

2 回答 2

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);

 }

}

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

于 2012-08-29T13:15:50.370 回答
1

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

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

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)
于 2012-08-29T16:22:26.590 回答