2010-04-28 46 views
2

我有一个托管Windows服务,托管一对WCF端点。该服务设置为在PC重新启动时自动启动。在重新启动时我发现,这行代码:从Windows服务托管的WCF端点的问题

ServiceHost wcfHost1 = new ServiceHost(typeof(WCFHost1)); 
在服务的OnStart()方法

15之间的某个地方发生 - 20秒执行。其实我有两个这样的陈述,但第二个在闪光灯下执行。这是第一个需要这么长时间的人。有谁知道什么可能导致瓶颈?正因为如此,有时候这个调用超过了30秒,结果SCM认为我的服务在尝试初始化的时候超时了。现在,我知道对我来说很简单,只需分离线程即可完成此操作,并立即从OnStart()返回,但我想知道可能会导致此延迟。

发生这种情况只有服务在PC重新启动时启动。如果PC启动并运行,服务在不到一秒钟内启动&停止。

+0

对ServiceHost.Open()的第一次调用可能会设置整个WCF运行时和所有 - 这将需要一两秒..... – 2010-04-28 05:29:19

+0

您正在测试哪个版本的Windows? – 2010-06-25 07:28:57

回答

0

This可能会提供更多帮助。基本上,我认为你需要弄清楚你有什么依赖关系,并将它们添加到你的服务中,以便它们在你的服务之前启动。

这只是一个黑暗中的镜头,但可能是.net框架尚未加载。也许,您可以尝试将自动启动设置为延迟自动启动,这将允许.net框架和其他Windows服务时间启动。

另外,当.net应用程序启动时,它将使用即时编译器进行编译。这可能正在等待.net来编译它。

最后,根据您正在使用的WCF实例的类型,您可能会遇到构造函数花费一段时间来初始化的问题。

希望这会有所帮助。

+0

@ daub815:延迟启动在XP上不可用,我需要它可以在XP和Vista上运行。而且我知道服务实现的ctor几乎没有做任何事情。 – Dilip 2010-04-28 01:35:26

+0

@ daub815:对不起,我第一次没有看到你的链接。我并不是那么复杂。我OP中的这个简单的ServiceHost实例化行是所有瓶颈所在。 – Dilip 2010-04-28 02:05:06

+0

这条简单的线路在覆盖范围内有很多功能,如果它只在启动时发生,那么还有另一种服务需要在启动之前启动。 – kevindaub 2010-04-29 01:14:32

0

我遇到了需要很长时间才能启动的Windows服务的问题。我发现这是因为我使用的签名程序集(企业库)。 .NET试图在程序集加载时验证Authenticode签名(也许你的构造函数第一次使用了一个类型,导致加载该程序集)。只需尝试将以下内容添加到您的app.config。当它不起作用时,你有另一个问题。

<configuration> 
    <runtime> 
     <generatePublisherEvidence enabled="false"/> 
    </runtime> 
</configuration> 

你也可以在这里找到一些额外的信息:http://support.microsoft.com/kb/936707Why is my .Net app contacting Verisign?

0

没有与WCF服务没有问题。解决您的问题的最佳方式是创建一个虚拟操作,客户端必须先调用其他任何操作。这会迫使您的客户在您的真实交易之前与您的服务握手。我实际上使用虚拟操作来不时地调用我的服务来查看它是否还活着。

+0

对不起,但他的问题发生在'ServiceHost'打开,而不是操作调用。 – 2010-07-07 01:43:06

相关问题