在 WCF 启动时运行函数
Posted
技术标签:
【中文标题】在 WCF 启动时运行函数【英文标题】:Running a function on WCF start up 【发布时间】:2012-06-06 04:25:46 【问题描述】:我不确定它是否可能,但我希望在 WCF 服务启动后立即运行一个函数以生成初始缓存数据。我现在不担心如何实现缓存,我的问题严格来说是在服务启动时运行该功能。该服务将是 RESTful。
该服务最终将托管在 IIS 中并使用 .Net Framework 4.5
【问题讨论】:
【参考方案1】:最简单的方法是在你的 WCF 项目根目录下创建一个App_Code
文件夹,创建一个类(我将其称为Initializer
但没关系。重要的部分是方法名称),如下所示:
public class Initializer
public static void AppInitialize()
// This will get called on startup
更多关于AppInitialize
的信息可以在here找到。
【讨论】:
这可能正是我想要的。服务是否托管在 IIS 中是否重要? 是的,实际上它需要 IIS。 我发现这是一个糟糕的选择。包含“AppInitialize”的模块不与项目一起编译,而是作为“内容”提供并在加载服务时动态编译。因此,正确实现 IOC 所需的许多库都不可用(例如 System.Reflection)。虽然我同意对单一初始化方法的需求,但该解决方案受到动态编译这一事实的限制。 @DRAirey1,你可以从AppInitialize
调用你程序集中的任何类,所以我不明白你在说什么。
我知道 AppInitialized 是即时编译的。如果 IIS 周围没有外部库,则会出现“无法加载模块”异常。我试图将几个程序集输入到 MEF 容器构造中,但 IIS 无法找到“System.Reflection”。我敢肯定,我可以花几个小时来构建一个应用程序池,其中包含我提前需要的每个程序集,但是这个解决方案的空间太大了。 'ServiceHostFactory' 答案确保您需要的所有程序集都编译到代码中。【参考方案2】:
@KirkWoll 建议的方法有效,但前提是您在 IIS 中并且这是 App_Code 下唯一的 AppInitialize 静态方法。如果您想在每个服务的基础上进行初始化,如果您有不同的 AppInitialize 方法或者如果您不在 IIS 下,您还有以下其他选择:
如果使用 .NET Framework 4.5,并且在 IIS 下:您可以使用服务运行时将调用的服务配置方法。更多信息请访问http://msdn.microsoft.com/en-us/library/hh205277(v=vs.110).aspx。 如果您是自托管服务,您可以控制服务何时启动(调用ServiceHost.Open()
,以便您可以在那里对其进行初始化
如果您使用的是 IIS,而不是 4.5,则可以使用服务主机工厂和自定义服务主机,以便在打开服务主机时调用。此时,您可以进行初始化。你可以在http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx找到更多关于服务主机工厂的信息。
自定义工厂的示例如下所示:
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
文件的处理。但除此之外,很好的彻底答案。
我在使用 IIS/4.5 的“服务配置方法”时遇到了一个奇怪的副作用:在“配置”中,我不得不添加以下行,因为它不再读取我的 web.config 文件设置和一切都出了问题:config.LoadFromConfiguration ()
@user240374 非常有用的信息!阅读主要答案中链接的 MSDN 页面,看来 IIS/4.5“服务配置方法”的要点是允许您在代码中配置服务,而不是从 web.config 文件中配置服务。所以我想如果你有这些配置方法之一,IIS 将忽略 web.config,除非你明确告诉它去阅读它,这是有道理的。
我发现这是一个巨大的缺点:When defined, any service configuration settings specified in an app.config or web.config file will be ignored.
我想在启动时执行一些代码,但不禁用基于文件的配置。【参考方案3】:
在我的情况下,我确实喜欢下面。我有托管 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
【讨论】:
如果有人想要这个链接,docs.microsoft.com/en-us/archive/msdn-magazine/2007/september/… 声明“WCF ServiceHost 类型具有两个称为打开和关闭的事件。它们是在服务启动和关闭时执行代码的唯一正确方法。 "以上是关于在 WCF 启动时运行函数的主要内容,如果未能解决你的问题,请参考以下文章