拜托,有人可以告诉我吗?我创建了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对象中检索数据。
非常感谢
答案 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)