在 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 启动时运行函数的主要内容,如果未能解决你的问题,请参考以下文章

在域帐户下运行的 WCF 服务

Windows 服务(托管 WCF 服务)在启动时立即停止

保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它

IIS托管WCF服务:集成测试和代码覆盖

从 WCF 服务调用进程以在 WCF 服务帐户下运行

在服务启动之前初始化 WCF 服务?