服务OnShutDown()期间的WCF调用

时间:2012-03-22 14:32:57

标签: c# wcf

我知道在这个主题上还有一些其他类似的问题,但是它们似乎都没有答案,所以我想我们都可以在这里哈希。

我的服务器上运行了WCF服务,我试图通过覆盖“OnShutDown()”来关闭服务器时发送状态消息。

这可以看作如下:

     protected override void OnShutdown()
           {
               try
               {
                   client.updateInvStatus(machineName, "Client Host Has Shutdown");
               }
               catch (Exception ex)
               {
                   EH.writeToErrorLog("||OnShutdown||Error Shutting Down System \r\n" + ex);

               }
               base.OnShutdown();
           }

这似乎在50%的时间内起作用,另外50%我得到以下错误:

System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure         channel for SSL/TLS with authority '"ENDPOINT ADDRESS REMOVED'. --->     System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.GetResponse()
   at    System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitF orReply(TimeSpan timeout)
 --- End of inner exception stack trace ---

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebExceptoon webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at Ascertain.AscertainAgent.IService.updateInvStatus(String hostNM, String invValue)
   at Ascertain.AscertainAgent.ServiceClient.updateInvStatus(String hostNM, String invValue) in C:\Users\daladd\Documents\CS\Ascertain\Ascertain\Ascertain\Service References\AscertainAgent\Reference.cs:line 209
   at Ascertain.Service1.OnShutdown() in       "FILE LOCATION REMOVED"\Service1.cs:line224

有没有人知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

我最后关注了Dr.Wily不得不说的话。我为我的连接添加了一个保持活动状态,现在代码每次都会工作。基本上,Windows在OnShutDown()方法期间不会打开任何新连接,因此如果连接超时,它将无法正常工作。

如果有人对此有所了解仍然会令人惊讶,因为使用这种方法,我将拥有与中央服务器的2000个持久连接。 Shiraz,我确实尝试更改注册表项以允许更长的超时,但时间并没有最终成为一个问题。

答案 1 :(得分:0)

这可能与关闭时间有关。如果关闭时间过长,则进程被终止。这可能发生在你身上。

尝试在此处增加超时时间:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Contro l \ WaitToKillServiceTimeout

事件日志中可能有一个事件说该进程已被终止。