如何使IIS等待WCF服务准备好了?

时间:2010-04-12 19:48:39

标签: wcf iis

我在IIS 7中托管了一个WCF服务。此服务完成后需要几分钟才能加载其数据并准备好进行外部调用。内部线程中的数据加载。问题是从IIS点开始,服务就在它被激活(通过一些调用)之后就绪,并且它处理请求而不等待加载数据。

是否可以告诉IIS该服务仍在加载并使该服务不可用于请求?如果此类请求会引发异常,则没问题。

2 个答案:

答案 0 :(得分:2)

您可以在服务的默认构造函数中同步调用初始化逻辑。在创建服务实例之前不会调用服务操作,这只会在初始化完成后才会发生。与此同时,客户根本不会收到回复。

这是一个简单的例子:

public class MyService : IMyService
{
    public MyService()
    {
        // Blocking call that initializes
        // the service instance
        this.Initialize();
    }

    public void GetData()
    {
        // The service operation will be invoked
        // after the service instance has been created
        // at which point the initialization is complete
    }

    private void Initialize()
    {
        // Initialization logic
    }
}

如果初始化逻辑很昂贵,您应该考虑将服务作为单例运行,以便仅在第一次请求时支付价格。或者,您可以将初始化期间加载的数据存储在集中式缓存中。这样,它可以用于多个服务实例,同时仍然只需加载一次。

如果初始化逻辑在多个服务之间共享,则应考虑通过覆盖 ServiceHost 方法在自定义 OnOpening 中实施一次。由于您在IIS中托管服务,因此您还需要实施自定义 ServiceHostFactory 来创建ServiceHost实例。
您可以在此处详细了解此方法this MSDN article

答案 1 :(得分:1)

发现“ASP.NET 4和Visual Studio 2010 Web开发概述”中描述的这一新功能:http://www.asp.net/LEARN/whitepapers/aspnet4/#0.2__Toc253429241

问题是它需要在Windows Server 2008 R2上运行IIS 7.5,但适用于ASP.NET 2.0 +