-2

我正在尝试在 Windows 服务中编写简单的 wcf 服务自托管但 Windows 服务的 ServiceHandle 始终为 0

我需要使用 RegisterDeviceNotification 检测硬件更改它的参数之一是 Handle,在我的例子中是 ServiceHandle

public partial class MyService : ServiceBase, IMyService
{
    private ServiceHost host;

public static void Main()
{
    ServiceBase.Run(new MyService());
}

public MyService()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    try
    {
        host = new ServiceHost(typeof(MyService), new Uri(@"net.pipe://localhost/MyService"));
        host.Open();
    }
    catch (Exception e)
    {
        EventLog.WriteEntry("MyService:", e.Message);
    }
}

protected override void OnStop()
{
    host.Close();
}

#region IMyService Members

public void Register()
{
    //Here the ServiceHost is 0        
}
#endregion

}

什么会导致问题?谢谢

4

1 回答 1

1

ServiceHandle无论值是什么,都不需要将 WCF 服务作为 Windows 服务托管。只需实例化ServiceHostinOnStart并将其关闭,就OnStop可以了。

这就是为什么ServiceHandle在您的情况下始终为 0 的原因:

您的 Windows 服务类实现您的 WCF 服务合同。这不是一件好事,也是ServiceHandle属性为 0 的原因。每次调用 WCF 服务时都会实例化一个新的MyService类实例(如果您没有更改默认值)。此实例是不知道它是 Windows 服务的类的普通实例,因此所有与 Windows 服务相关的属性都有其默认值。只有由 Windows 服务管理器创建的实例具有所有适当的属性集。

您可以自己尝试:在OnStart中,插入以下行并检查myServiceVar.ServiceHandle. 你会看到它是0

MyService myServiceVar = new MyService();

真正 想要做的是:让不同的类实现服务合同,例如:

public class MyWCFService : IMyService
{
    public static IntPtr ServiceHandle;

    public void Register()
    {
        // Use MyWCFService.ServiceHandle here
    }  
}

OnStart方法中,设置ServiceHandle变量MyWCFService

protected override void OnStart(string[] args)
{
    try
    {
        MyWCFService.ServiceHandle = this.ServiceHandle;

        host = new ServiceHost(typeof(MyWCFService), new Uri(@"net.pipe://localhost/MyService"));
        host.Open();
    }
    catch (Exception e)
    {
        EventLog.WriteEntry("MyWCFService:", e.Message);
    }
}
于 2012-06-06T09:11:28.553 回答