【发布时间】:2012-06-06 04:25:46
【问题描述】:
我不确定它是否可能,但我希望在 WCF 服务启动后立即运行一个函数以生成初始缓存数据。我现在不担心如何实现缓存,我的问题严格来说是在服务启动时运行该功能。该服务将是 RESTful。
该服务最终将托管在 IIS 中并使用 .Net Framework 4.5
【问题讨论】:
我不确定它是否可能,但我希望在 WCF 服务启动后立即运行一个函数以生成初始缓存数据。我现在不担心如何实现缓存,我的问题严格来说是在服务启动时运行该功能。该服务将是 RESTful。
该服务最终将托管在 IIS 中并使用 .Net Framework 4.5
【问题讨论】:
最简单的方法是在你的 WCF 项目根目录下创建一个App_Code 文件夹,创建一个类(我将其称为Initializer 但没关系。重要的部分是方法名称),如下所示:
public class Initializer
{
public static void AppInitialize()
{
// This will get called on startup
}
}
更多关于AppInitialize的信息可以在here找到。
【讨论】:
AppInitialize 调用你程序集中的任何类,所以我不明白你在说什么。
@KirkWoll 建议的方法有效,但前提是您在 IIS 中并且这是 App_Code 下唯一的 AppInitialize 静态方法。如果您想在每个服务的基础上进行初始化,如果您有不同的 AppInitialize 方法或者如果您不在 IIS 下,您还有以下其他选择:
ServiceHost.Open(),以便您可以在那里对其进行初始化自定义工厂的示例如下所示:
public class MyFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
host.Opening += new EventHandler(host_Opening);
return host;
}
void host_Opening(object sender, EventArgs e)
{
// do initialization here
}
}
}
【讨论】:
AppInitialize,因为我正在接管自动生成的.svc文件的处理。但除此之外,很好的彻底答案。
config.LoadFromConfiguration ()
When defined, any service configuration settings specified in an app.config or web.config file will be ignored. 我想在启动时执行一些代码,但不禁用基于文件的配置。
在我的情况下,我确实喜欢下面。我有托管 WCF Rest 服务的 Windows 服务项目。我在我的 Windows 服务项目 MyService.cs 中编写了以下代码
protected override void OnStart(string[] args)
{
try
{
ServiceHost myServiceHost = new ServiceHost(typeof(myservice));
myServiceHost.Opening += OnServiceHostOpening;
myServiceHost.Open();
}
catch (Exception ex)
{
//handle exception
}
}
private void OnServiceHostOpening(object sender, EventArgs e)
{
//do something
}
【讨论】: