2011-06-02 116 views
0

我已经用C#.NET编写了一个Windows服务。此Windows服务包含一个WCF服务。然后,我在Windows服务的OnStart中使用一个新的ServiceHost来监听WCF服务的消息。然后关闭OnStop中的ServiceHost。当Windows服务停止时,WCF服务仍然可以调用

当服务运行时,我可以调用WCF服务就好了。但是,我然后停止服务,但仍可以调用WCF服务。我并没有想到会发生这种情况。到底是怎么回事?

的OnStart和调用OnStop代码如下

protected override void OnStart(string[] args) 
    { 
     if (serviceHost != null) 
     { 
      serviceHost.Close(); 
     } 

     serviceHost = new ServiceHost(typeof(MyService)); 

     // Open the ServiceHostBase to create listeners and start 
     // listening for messages. 
     serviceHost.Open(); 
    } 

    protected override void OnStop() 
    { 
     if (serviceHost != null) 
     { 
      serviceHost.Close(); 
      serviceHost = null; 
     } 
    } 
+1

请给我们一些onstop/onstart代码示例。 – Nix 2011-06-02 12:11:22

+1

不能。无论你在代码中写什么都没关系。如果您关闭了Windows服务,则WCF服务不会侦听。我建议你重新检查你的测试。 – Gilad 2011-06-02 12:15:20

+0

我想知道是否OnStop甚至被称为BC,我同意@Gilad – Nix 2011-06-02 12:19:43

回答

0

我现在已经解决了这个问题,并认为我会更新答案。虽然我怀疑其他人会如此愚蠢;)

我已经添加了对我的客户端应用程序的引用,方法是右键单击项目并选择“添加引用”而不是“添加服务引用”。我仍然不确定为什么这会允许服务在不运行时被调用,但是现在我已经将它作为服务引用添加了,所有工作都按预期工作。

感谢大家的意见。

+1

:)大概你直接实例化客户端代码中的服务对象,而不是代理服务器?我曾经花了半天的时间在调试程序打破* service *中的异常时,在我的客户端代码中查找错误,如同白天一样... – shambulator 2011-06-03 21:31:46

0

OnStop方法是这个样子:

protected override void OnStop() 
{ 
    if (serviceHost != null) 
    { 
     try { 
      serviceHost.Close(); 
     }catch{ 
      //could throw an exception if it is in a bad state 
     }finally{ 
      serviceHost = null; 
     } 
    } 
} 

检查第二件事是,你调用OnStop被调用,它不会叫停如果CanStop flag是错误的。

+0

没有try/catch/finally块(我会添加)是的。我已经把代码放在了问题中。 – Jonnster 2011-06-02 12:49:28

+0

Onstop正在被调用。 – Jonnster 2011-06-02 13:11:48

+0

我在猜测,因为您没有捕获,当您停止时没有记录错误? – Nix 2011-06-02 13:25:03