【问题标题】:Running a function on WCF start up在 WCF 启动时运行函数
【发布时间】:2012-06-06 04:25:46
【问题描述】:

我不确定它是否可能,但我希望在 WCF 服务启动后立即运行一个函数以生成初始缓存数据。我现在不担心如何实现缓存,我的问题严格来说是在服务启动时运行该功能。该服务将是 RESTful。

该服务最终将托管在 IIS 中并使用 .Net Framework 4.5

【问题讨论】:

    标签: c# .net wcf rest


    【解决方案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 下,您还有以下其他选择:

    自定义工厂的示例如下所示:

    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
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2021-04-08
    • 1970-01-01
    相关资源
    最近更新 更多