如何通过 WCF 与 Windows 服务通信?
How to communicate to Windows Service through WCF?
我有 Windows 服务,它是 运行ning 定时任务。我还选择通过 WCF 命名管道通道与 Windows 服务通信。我可以创建 WCF 服务实例并打开它进行侦听。但是我如何通过 WCF 访问依赖于 Windows 服务的对象?
这是我的 Windows 服务的样子:
public partial class MyService : ServiceBase
{
private ServiceHost m_svcHost = null;
private myObject = null;
...
// Run this method from external WCF client
private void SomeMethod()
{
}
protected override void OnStart(string[] args)
{
if (m_svcHost != null) m_svcHost.Close();
m_svcHost = new ServiceHost(typeof(MyCommunicationService));
m_svcHost.Open();
// initialize and work with myObject
}
protected override void OnStop()
{
if (m_svcHost != null)
{
m_svcHost.Close();
m_svcHost = null;
}
}
}
所以我想要的是在客户端进行查询时访问 WCF 服务中的 myObject。甚至 运行 myObject 上的一个方法。
您可以简单地使用静态 属性:
在 MyService
(WCF 托管实体)和 MyCommunicationService
(WCF 服务实例)之间创建一个通信通道
//This can be put into a separate DLL if needed.
public interface IMyHostCallbacks
{
void HostCallback(string iSomeDataFromWCFToHost);
}
public static class Host
{
public static IMyHostCallbacks Current;
}
public partial class MyService : ServiceBase, IMyHostCallbacks
{
protected override void OnStart(string[] args)
{
//Set the static callback reference.
Host.Current = this;
if (m_svcHost != null) m_svcHost.Close();
m_svcHost = new ServiceHost(typeof(MyCommunicationService));
m_svcHost.Open();
// initialize and work with myObject
}
//Here you have data from WCF and myObject available.
void IMyHostCallbacks.HostCallback(string iSomeDataFromWCFToHost)
{
//Be careful here.
//Depending on your WCF service and WCF clients this might
//get called simultaneously from different threads.
lock(myObject)
{
myObject.DoSomething(iSomeDataFromWCFToHost);
}
}
}
当然,您甚至可以将静态字段放入 MyService
class,但至少 MyService
和 MyCommunicationService
之间的一些抽象不会造成伤害。
现在,在您 MyCommunicationService
的任何地方,您都可以:
void WCFServiceMethod()
{
Host.Current.HostCallback("some data");
}
我有 Windows 服务,它是 运行ning 定时任务。我还选择通过 WCF 命名管道通道与 Windows 服务通信。我可以创建 WCF 服务实例并打开它进行侦听。但是我如何通过 WCF 访问依赖于 Windows 服务的对象?
这是我的 Windows 服务的样子:
public partial class MyService : ServiceBase
{
private ServiceHost m_svcHost = null;
private myObject = null;
...
// Run this method from external WCF client
private void SomeMethod()
{
}
protected override void OnStart(string[] args)
{
if (m_svcHost != null) m_svcHost.Close();
m_svcHost = new ServiceHost(typeof(MyCommunicationService));
m_svcHost.Open();
// initialize and work with myObject
}
protected override void OnStop()
{
if (m_svcHost != null)
{
m_svcHost.Close();
m_svcHost = null;
}
}
}
所以我想要的是在客户端进行查询时访问 WCF 服务中的 myObject。甚至 运行 myObject 上的一个方法。
您可以简单地使用静态 属性:
在MyService
(WCF 托管实体)和 MyCommunicationService
(WCF 服务实例)之间创建一个通信通道
//This can be put into a separate DLL if needed.
public interface IMyHostCallbacks
{
void HostCallback(string iSomeDataFromWCFToHost);
}
public static class Host
{
public static IMyHostCallbacks Current;
}
public partial class MyService : ServiceBase, IMyHostCallbacks
{
protected override void OnStart(string[] args)
{
//Set the static callback reference.
Host.Current = this;
if (m_svcHost != null) m_svcHost.Close();
m_svcHost = new ServiceHost(typeof(MyCommunicationService));
m_svcHost.Open();
// initialize and work with myObject
}
//Here you have data from WCF and myObject available.
void IMyHostCallbacks.HostCallback(string iSomeDataFromWCFToHost)
{
//Be careful here.
//Depending on your WCF service and WCF clients this might
//get called simultaneously from different threads.
lock(myObject)
{
myObject.DoSomething(iSomeDataFromWCFToHost);
}
}
}
当然,您甚至可以将静态字段放入 MyService
class,但至少 MyService
和 MyCommunicationService
之间的一些抽象不会造成伤害。
现在,在您 MyCommunicationService
的任何地方,您都可以:
void WCFServiceMethod()
{
Host.Current.HostCallback("some data");
}