我在IIS 7中托管了一个WCF服务。此服务完成后需要几分钟才能加载其数据并准备好进行外部调用。内部线程中的数据加载。问题是从IIS点开始,服务就在它被激活(通过一些调用)之后就绪,并且它处理请求而不等待加载数据。
是否可以告诉IIS该服务仍在加载并使该服务不可用于请求?如果此类请求会引发异常,则没问题。
答案 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 +