2

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

ServiceHost wcfHost1 = new ServiceHost(typeof(WCFHost1));

在服务的 OnStart() 方法中执行需要 15 - 20 秒。实际上我有两个这样的语句,但第二个是在瞬间执行的。这是第一个需要这么长时间的。有谁知道可能导致瓶颈的原因?因此,有时调用超过 30 秒,因此 SCM 认为我的服务在尝试初始化时超时。现在,我知道我很容易分离一个线程来执行此操作并立即从 OnStart() 返回,但我想知道是什么导致了这种延迟。

当服务在 PC 重新启动时启动时才会发生这种情况。如果 PC 已启动并正在运行,则服务将在不到一秒的时间内启动和停止。

4

3 回答 3

0

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

于 2010-07-07T01:20:12.230 回答
0

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

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

您还可以在此处找到一些额外信息:http: //support.microsoft.com/kb/936707以及为什么我的 .Net 应用程序联系 Verisign?

于 2010-06-25T07:10:21.737 回答
0

可能会提供更多帮助。基本上,我认为您需要弄清楚您拥有哪些依赖项并将它们添加到您的服务中,以便它们在您的服务之前开始。

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

此外,当 .net 应用程序启动时,它会使用 Just-In-Time 编译器进行编译。这可能正在等待 .net 编译它。

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

希望这可以帮助。

于 2010-04-28T01:30:56.130 回答