【问题标题】:ServiceHandle is 0服务句柄为 0
【发布时间】:2012-06-06 09:06:58
【问题描述】:

我正在尝试编写简单的 wcf 服务自托管在 Windows 服务中 但是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

}

什么会导致问题? 谢谢

【问题讨论】:

  • 你需要ServiceHandle做什么?
  • 哇哦!服务类不应该执行操作契约!!将其分开,并让一个新类实现服务契约。

标签: c# wcf windows-services


【解决方案1】:

ServiceHandle - 无论是什么值 - 都不需要将 WCF 服务作为 Windows 服务托管。只需在OnStart 中实例化ServiceHost 并在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方法中,设置MyWCFServiceServiceHandle变量:

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

【讨论】:

  • 我正在尝试在 Windows 服务中自行托管 wcf 服务,就像这里 link
  • 我知道。这并不能回答您需要服务句柄来做什么的问题。您是否曾经创建过已安装的 Windows 服务?
  • 我需要使用RegisterDeviceNotification检测硬件变化它的一个参数是Handle,在我的例子中是ServiceHandle 对于你的问题,是的!
  • 嗯,那是完全不同的事情 - 最初,您的问题听起来像“我正在尝试在 Windows 服务中托管 WCF 服务,但我不能,因为 ServiceHandle 为 0”。现在你说:我的问题与 WCF 没有任何联系。我正在尝试创建 Windows 服务,而 ServiceHandle 始终为 0。
  • 编辑了我的答案以说明为什么 ServiceHandle 为 0 以及如何正确处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多